1

我正在创建列表总和并option在其中使用。当我传递一个空列表时,我应该得到NONEor else 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或包含其他值。

我已经尝试过各种方式,但我无法掌握如何以这种方式进行操作。

4

1 回答 1

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))
于 2013-01-28T10:21:22.417 回答