我是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 ;
Run Code Online (Sandbox Code Playgroud)
这是我在这里遇到的一个程序.我如何使用SOME和NONE,以及如何使用'之前'?
在option如果存在具有没有有效的值的东西可能的数据类型被使用.
例如,
fun divide x y = if y == 0 then NONE else SOME (x / y)
Run Code Online (Sandbox Code Playgroud)
如果您需要处理除以零的特殊情况而不诉诸异常,则可以使用.
TextIO.inputLineNONE当没有更多要阅读的内容时返回,并且,当有内容时,它已读取的行在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
Run Code Online (Sandbox Code Playgroud)
Some('a)并且None是Option数据类型的一部分.Option是SML的Basis Library中的代数或复合数据结构.有关维基百科的Option数据类型的更多信息.最大的想法是,None当函数返回程序员真正关心的类型的值没有意义时,允许函数返回值.
对于用户定义的函数readlist,重要数据是字符串.但在某些时候,程序会命中文件的末尾并读取一个被解释为EOF而不是字符串的值.
想想TextIO.openIn作为打开流,其中搜索字符串的函数.每次找到一个字符串时,它都会返回一个option(string).当它找不到字符串时,它返回None.因为两者都是Option(string)数据类型的一部分,所以TextIO.openIn只返回一种类型.
inputLine strm a stream]返回SOME(ln),其中ln是流strm中的下一行输入.具体来说,ln返回当前位置的所有字符,包括下一个换行符(#"\n")字符.如果它在下一个换行符之前检测到流末尾,则返回附加换行符的字符读取.因此,保证ln始终是新行终止的(因此非空).如果当前流位置是流末尾,则返回NONE.如果行的长度超过最长字符串的长度,则会引发Size.
SML中的相关概念是用户定义的数据类型.两个option数据结构和用户定义的数据类型提供了在一定程度上相似的方式的方式的对象SML的静态类型系统内灵活性在静态类型面向对象的语言被使用.