SML使用选项和模式匹配的总和

时间:2013-01-28 09:37:32

标签: functional-programming pattern-matching sml smlnj ml

我正在创建列表总和并在其中使用option。当我通过一个空列表时,我应该NONESOME 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还是包含其他值。

我已经尝试了各种各样的方式,但我不知道如何以这种方式做。

1 个答案:

答案 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))