SML如何定义正确的选项

Sib*_*ibi 2 sml smlnj pattern-matching

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

fun sum_list xs =
case xs of
    [] => NONE
 | x::xs' => SOME (x+sum_list xs')
Run Code Online (Sandbox Code Playgroud)

这段代码很有效,而不是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
Run Code Online (Sandbox Code Playgroud)

Die*_*lla 5

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

x + sum_list xs'
Run Code Online (Sandbox Code Playgroud)

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