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 に答える