SML中的SOME和NONE有哪些选择?

时间:2014-07-27 12:09:36

标签: sml smlnj

我是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,以及如何在'之前使用'

2 个答案:

答案 0 :(得分:8)

如果可能存在无效值,则使用option数据类型。

例如,

fun divide x y = if y == 0 then NONE else SOME (x / y)
如果您需要处理除以零的特殊情况而不诉诸异常,则可以使用

当没有其他内容可供阅读时,

TextIO.inputLine会返回NONESOME 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)NoneOption数据类型的一部分。 OptionSML'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 datatypesoption数据结构和用户定义的数据类型都在SML的静态类型系统中提供了灵活性,其方式与在静态类型的面向对象语言中使用对象的方式类似。