为什么以下代码不起作用?
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
答案 0 :(得分:5)
问题是该函数返回'a option
但是在lat表达式中你使用它就像它返回一个int:
x + sum_list xs'
你必须构建一个仅在列表中起作用的内部函数并返回数字(不是选项),然后将最终结果打包成一个选项,或者在返回时评估sum_list
的结果以查看它是否存在包含值或NONE
。我可以写两种方式,但你应该在看到解决方案之前尝试。