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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…