使用Options获取SML中的整数列表的Max有什么好处

时间:2013-12-30 02:14:52

标签: recursion options sml

在我昨天的问题Getting max value from a list in SML中,我在Andreas Rossberg的帮助下想出了如何使用SML评估获取整数列表的Max的函数。

继续我的学习。修改了相同的代码以使用选项。这是代码

fun max1 (xs : int list) =
  if null xs
  then NONE
  else 
    let val tl_ans = max1(tl xs)
    in
      if isSome tl_ans andalso valOf tl_ans > hd xs
      then tl_ans
      else SOME (hd xs)
    end

我有以下问题:

  1. 为什么else语句中的代码输出类型option
  2. 的值
  3. 使用option s?
  4. 有什么好处

1 个答案:

答案 0 :(得分:6)

对第一个问题的评论:不仅else-branch产生类型为option的值,if-branch也是如此(即NONE)。通常,if结构的两个分支必须具有相同的类型。

至于你的第二个问题。 option类型通常用于显式编码函数的偏好(即,如果输入没有正确的结果)。在获取列表中包含的最大值的情况下,当输入为空列表时,会发生这种情况。有了你上一篇文章的功能,我们得到了

max [] = 0

(用文字:空列表中包含的最大值是0 ),这是错误的,因为我们会例如得到

max [0] = 0

为了区分这两种情况,我们可以使用option类型,从而产生

max1 [] = NONE
max1 [0] = SOME 0

返回选项类型(在本例中为'int option)的原因是我们获得了更细粒度的信息:首先,已经是max1的类型,即int list => int option ,告诉我们函数是部分的(我们可能得到SOME结果或NONE);其次,每当我们得到NONE时,我们就知道输入是空列表。