Recursion 使用选项获取SML中整数列表的最大值有什么好处

Recursion 使用选项获取SML中整数列表的最大值有什么好处,recursion,options,sml,Recursion,Options,Sml,在我昨天的上一个问题中,我在Andreas Rossberg的帮助下想出了如何计算一个函数,该函数使用SML获得整数列表的最大值 继续我的学习。修改了相同的代码以使用选项。这是密码 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

在我昨天的上一个问题中,我在Andreas Rossberg的帮助下想出了如何计算一个函数,该函数使用SML获得整数列表的最大值

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

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
我有以下问题:

  • 为什么else语句中的代码会输出类型为
    option
    的值
  • 使用
    选项的优点是什么

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

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

    max [] = 0
    
    (换句话说:空列表中包含的最大值是0),这在某种程度上是错误的,因为我们也会得到

    max [0] = 0
    
    为了区分这两种情况,我们可以使用
    选项
    类型,从而

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