我是SML的新手(实际上是编程)。
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 ;
这是我在这里遇到的一个程序。我如何使用SOME和NONE,以及如何在'之前使用'
答案 0 :(得分:8)
如果可能存在无效值,则使用option
数据类型。
例如,
fun divide x y = if y == 0 then NONE else SOME (x / y)
如果您需要处理除以零的特殊情况而不诉诸异常,则可以使用。
当没有其他内容可供阅读时, TextIO.inputLine
会返回NONE
,SOME l
会在有l
的情况下返回before
。
'a * unit -> 'a
是一个低优先级(最低的)中缀函数,首先计算其左侧,然后是右侧,然后返回左侧的值。
它的类型为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
,即右侧仅用于其副作用。
在这种情况下,它使代码比等效的
更具可读性(和功能性){{1}}
答案 1 :(得分:5)
Some('a)
和None
是Option
数据类型的一部分。 Option
是SML's Basis Library中的代数或复合数据结构。有关Wikipedia处的选项数据类型的更多信息。最大的想法是,当函数返回程序员真正关心的类型的值没有意义时,允许函数返回值None
。
对于用户定义的函数readlist
,重要的数据是字符串。但在某些时候,程序会命中文件的末尾并读取一个解释为EOF
而不是字符串的值。
将TextIO.openIn
视为打开流并搜索字符串的函数。每次找到字符串时,都会返回option(string)
。如果找不到字符串,则返回None
。因为两者都是Option(string)
数据类型的一部分,TextIO.openIn
只返回一种类型。
inputLine strm a stream] 返回SOME(ln),其中ln是流strm中的下一行输入。具体来说,ln返回当前的所有字符 位置直到并包括下一个换行符(#“\ n”)。如果它 在下一个换行符之前检测到一个流末尾,它返回 读取的字符附加换行符。因此,ln保证 永远是新行终止(因此非空)。如果是当前的 stream position是流的结尾,然后返回NONE。它提出来了 如果线的长度超过最长的长度,则调整大小 字符串。
SML中的相关概念是user-defined datatypes。 option
数据结构和用户定义的数据类型都在SML的静态类型系统中提供了灵活性,其方式与在静态类型的面向对象语言中使用对象的方式类似。