SML中有些选项和没有选项是什么?

SML中有些选项和没有选项是什么?,sml,smlnj,Sml,Smlnj,我是SML的新手(实际上是编程) 这是我在这里遇到的一个程序。如何使用SOME和NONE,以及如何使用'before'?SOME('a)和NONE是选项数据类型的一部分。是中的代数或复合数据结构。有关选项数据类型的详细信息,请参阅。最大的想法是,当函数返回程序员真正关心的类型的值没有意义时,允许函数返回值None 对于用户定义的函数readlist而言,重要的数据是字符串。但在某个时刻,程序会到达文件的末尾,并读取一个解释为而不是字符串的值 将TextIO.openIn看作是一个打开流并在其中搜

我是SML的新手(实际上是编程)

这是我在这里遇到的一个程序。如何使用SOME和NONE,以及如何使用'before'?

SOME('a)
NONE
选项
数据类型的一部分。是中的代数或复合数据结构。有关选项数据类型的详细信息,请参阅。最大的想法是,当函数返回程序员真正关心的类型的值没有意义时,允许函数返回值
None

对于用户定义的函数
readlist
而言,重要的数据是字符串。但在某个时刻,程序会到达文件的末尾,并读取一个解释为而不是字符串的值

TextIO.openIn
看作是一个打开流并在其中搜索字符串的函数。每次找到字符串时,它都返回一个
选项(字符串)
。如果找不到字符串,则返回
None
。因为两者都是
选项(字符串)
数据类型的一部分,所以只返回一个类型

输入行strm a流] 返回SOME(ln),其中ln是流strm中的下一行输入。具体来说,ln返回当前字符串中的所有字符 定位到并包括下一个换行符(#“\n”)字符。如果是 在下一个换行之前检测流的结束,它返回 读取的字符加上换行符。因此,ln保证 始终以新行结尾(因此非空)。如果当前 stream position是流的结尾,然后返回NONE。它引起 如果行的长度超过最长行的长度,则为大小 绳子


SML中的一个相关概念是。
选项
数据结构和用户定义的数据类型在SML的静态类型系统中提供了灵活性,其方式与静态类型的面向对象语言中使用对象的方式类似。

如果存在没有有效值的可能性,则使用
选项
数据类型

比如说,

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

TextIO.inputLine
在没有更多内容可读取时返回
NONE
,并且
一些l
,其中
l
是它在有内容时已读取的行

before
是一个低优先级(所有中缀函数中最低的)中缀函数,它首先计算其左侧,然后计算右侧,然后返回左侧的值。
它的类型为
'a*装置->'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 

在你目前的水平上,你最好通过阅读教程来学习SML。阅读程序并询问你遇到的每一个你不懂的单词不会有效地利用任何人的时间。Try(谷歌搜索“SML教程”时的第一个链接)您应该查找“选项”数据类型,以了解有关您的问题的更多信息。@PascalCuoq我看到的是一个看过一个程序的人,该程序做了一些非常实用的事情——从文件中获取数据——并试图了解它在做什么。不幸的是,在标准ML'97中编程:您链接到的教程介绍假定读者已经了解
选项
结构,即第一次使用是“Bool.fromString函数的结果要么没有,要么是一些b”,因为教程假定读者有C方面的经验:例如。“一个熟悉的处理文件的C编程隐喻可以很容易地在标准ML中实现。“@benrudgers我不是说ML教程没有问题。我选择了第一个,因为如果一个好的存在的话,我无法区分好的和坏的。但是,在遇到第一种选项类型之前,尝试阅读使用
TextIO.openIn
的程序并不是一次很好的编程学习体验。@PascalCuoq这是一个很好的教程。但C并不是贝尔实验室推出的唯一语言。有大量的初级程序,从磁盘读取文件可以极大地提高效率——在REPL中输入数据或在源代码中插入幻数对于调试来说是很好的,但对于数据处理来说往往是很麻烦的。我知道你的评论是如何让互联网变得更好的。
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