【问题标题】:What are the options SOME and NONE in SML?SML 中有哪些选项 SOME 和 NONE?
【发布时间】:2014-09-18 18:54:53
【问题描述】:

我是 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怎么用,'before'怎么用?

【问题讨论】:

  • 以你目前的水平,你最好通过阅读教程来学习SML。阅读程序并询问您遇到的每个您不理解的单词不会有效地利用任何人的时间。试试homepages.inf.ed.ac.uk/stg/NOTES/notes.pdf(谷歌搜索“SML教程”时的第一个链接)
  • 您应该查找“选项”数据类型以了解有关您的问题的更多信息。
  • @PascalCuoq 我看到的是一个人看过一个程序,该程序做了一些非常实用的事情——从文件中获取数据——并试图了解它在做什么。不幸的是,您链接到的 Programming in Standard ML '97: A Tutorial Introduction 假设读者已经了解 option 结构,即第一次使用是 “来自 Bool 的结果。 fromString 函数要么是 NONE 要么是 SOME b" 因为教程假设有 C 经验:例如"一个熟悉的用于处理文件的 C 编程隐喻可以在标准 ML 中轻松实现。"
  • @benrudgers 我并不是说可用的 ML 教程没有问题。我选择了第一个,因为如果一个好的甚至存在的话,我不会区分一个好的和一个坏的。但是在遇到第一个选项类型之前尝试阅读使用TextIO.openIn 的程序不会是一次好的编程学习体验。
  • @PascalCuoq 这是一个很好的教程。但 C 并不是唯一从贝尔实验室出来的语言。有一大类初级程序,从磁盘读取文件可以大大提高效率——在 REPL 中输入数据或在源代码中插入幻数对于调试来说非常有用,但对于数据处理来说通常很麻烦。我知道您的评论如何让互联网变得更好。

标签: sml smlnj


【解决方案1】:

Some('a)NoneOption 数据类型的一部分。 OptionSML's Basis Library 中的代数或复合数据结构。有关选项数据类型的更多信息,请访问Wikipedia。重要的想法是,当函数返回程序员真正关心的类型的值没有意义时,允许函数返回值None

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

TextIO.openIn 视为打开流并在其中搜索字符串的函数。每次找到一个字符串时,它都会返回一个option(string)。当它没有找到字符串时,它返回None。因为两者都是Option(string) 数据类型的一部分,所以TextIO.openIn 只返回一个类型。

inputLine strm 一个流] 返回 SOME(ln),其中 ln 是流 strm 中的下一行输入。具体来说,ln 返回当前的所有字符 位置直到并包括下一个换行符 (#"\n") 字符。如果它 在下一个换行符之前检测到流结束,它返回 读取的字符附加换行符。因此,ln 保证 总是换行终止(因此非空)。如果当前 流位置是流的结尾,然后返回 NONE。它提出了 如果线的长度超过最长的长度,则为大小 字符串。

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

【讨论】:

    【解决方案2】:

    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 
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      相关资源
      最近更新 更多