SML如何定义合适的选择(SML How to define proper option)

2019-07-18 19:35发布

为什么不将下面的代码不能正常工作?

fun sum_list xs =
case xs of
    [] => NONE
 | x::xs' => SOME (x+sum_list xs')

此代码的工作好,而NONE,当它是零,当我删除一些。 我知道,对于一个空表零的总和是合理的答案。 但是,为什么下面的例子中失败?

更新:它制造按照迭戈的回答工作:

fun sum_list xs =
    case xs of
        [] => NONE
      | x => 
        let
            fun slist x =
                case x of
                    [] => 0
                  | x::xs' => x + slist xs'
        in 
            SOME (slist x)
        end

Answer 1:

问题是,该功能是由返回的'a option但在纬度表达你使用它,仿佛它返回一个int:

x + sum_list xs'

你必须要么建立在名单都是单纯的内部函数,返回的数字(不选择),然后框最终结果变成一个选项,或者EVAL结果sum_list返回时,看它是否包含一个值,或者是NONE 。 我可以写两种方式,但你看到写的解决方案之前,应该尝试。



文章来源: SML How to define proper option