我正在创建列表总和并在其中使用option
。当我通过一个空列表时,我应该NONE
或SOME value
。
我能够通过以下方式实现这一目标:
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
但我希望以相反的方式使用模式匹配来实现它,我想在其中评估sum_list
的结果,看它是NONE
还是包含其他值。
我已经尝试了各种各样的方式,但我不知道如何以这种方式做。
答案 0 :(得分:4)
我认为你现在拥有的东西非常清晰易懂。
如果您想避免使用slist
,则必须在列表的尾部递归调用sum_list
,在option
值上进行模式匹配并返回相应的结果:
fun sum_list xs =
case xs of
[] => NONE
| x::xs' => (case (sum_list xs') of
NONE => SOME x
| SOME y => SOME (x+y))