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)
问题是该函数返回一个'a option
但在lat表达式中你使用它就好像它返回一个int:
x + sum_list xs'
Run Code Online (Sandbox Code Playgroud)
您必须构建一个仅在列表中起作用的内部函数并返回数字(不是选项),然后将最终结果打包成一个选项,或者sum_list
在返回时查看它是否包含值或结果NONE
.我可以写两种方式,但你应该在看到解决方案之前尝试.