2

为什么下面的代码不起作用?

fun sum_list xs =
case xs of
    [] => NONE
 | x::xs' => SOME (x+sum_list xs')

当它不是 NONE 它为零并且当我删除 SOME 时,此代码运行良好。我知道对于一个空列表的总和为零是合理的答案。但是为什么下面的例子失败了?

更新:通过遵循 Diego 的回答使其工作:

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
4

1 回答 1

5

问题是该函数返回一个'a option但在 lat 表达式中你使用它就好像它返回一个 int:

x + sum_list xs'

您必须构建一个仅在列表中工作并返回数字(而不是选项)的内部函数,然后将最终结果装箱到选项中,或者评估sum_list返回时的结果以查看它是否包含值或它是NONE. 我可以两种方式都写,但你应该在看到写出的解决方案之前尝试一下。

于 2013-01-27T21:22:23.597 回答