SML如何定义正确的选项

时间:2013-01-27 21:04:44

标签: pattern-matching sml smlnj

为什么以下代码不起作用?

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

这段代码很有效,而不是NONE,它是零,当我删除SOME时。我知道,对于空列表的总和,零是合理的答案。但是为什么下面的例子失败了?

更新:遵循迭戈的答案:

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

1 个答案:

答案 0 :(得分:5)

问题是该函数返回'a option但是在lat表达式中你使用它就像它返回一个int:

x + sum_list xs'

你必须构建一个仅在列表中起作用的内部函数并返回数字(不是选项),然后将最终结果打包成一个选项,或者在返回时评估sum_list的结果以查看它是否存在包含值或NONE。我可以写两种方式,但你应该在看到解决方案之前尝试。