What are the options SOME and NONE in SML?

Rohan picture Rohan · Jul 27, 2014 · Viewed 8.9k times · Source

I am new to SML (and programming, actually).

fun readlist (infile : string) =  

  let
  val 
      ins = TextIO.openIn infile 

      fun loop ins = 

      case TextIO.inputLine ins of 

      SOME line => line :: loop ins 

    | NONE      => [] 

  in 

     loop ins before TextIO.closeIn ins 

  end ;

This is a program I encountered here. How do I use SOME and NONE, and how to use 'before'?

Answer

molbdnilo picture molbdnilo · Aug 6, 2014

The option data type is used if there is a possibility of something having no valid value.

For instance,

fun divide x y = if y == 0 then NONE else SOME (x / y)

could be used if you need to handle the special case of division by zero without resorting to exceptions.

TextIO.inputLine returns NONE when there is nothing more to read, and SOME l, where l is the line it has read, when there is.

before is a low-precedence (the lowest of all) infix function that first evaluates its left hand side, then the right hand side, and then returns the value of the left hand side.
It has type 'a * unit -> 'a, i.e. the right hand side is used only for its side effects.

In this case, it makes the code slightly more readable (and functional-looking) than the equivalent

fun readlist (infile : string) =  
  let
      val ins = TextIO.openIn infile 
      fun loop indata = 
          case TextIO.inputLine indata of 
              SOME line => line :: loop indata 
            | NONE      => []
      val result = loop ins
  in 
     TextIO.closeIn ins;
     result
  end