0

私は、SML要素を使用してMOOCコースを修了しようとしているもう1人の初心者です。リストを受け取り、要素を合計した2番目のリストを作成する関数を作成したいと思います。

正しく実行されると、この関数は before_reaching_sum_test([1,2,3,4,5,6,7,8,9]);次のリストに変換されます [1,3,6,10,16,23,31,40]

これは私がこれまでに持っているものですが、私はそれについて間違っていると確信しています。

fun before_reaching_sum_test(ints: int list) =
if null (tl ints)    
then []
else (hd ints + hd (before_reaching_sum_test(tl ints)))::(before_reaching_sum_test(tl ints))

これにより、最初のリストの最後の要素が省略されることを私は知っています。しかし、このようなものは機能しますか?

4

1 に答える 1

2

あなたの問題はこの行hd (before_reaching_sum_test(tl ints))にあります、それはあなたが頭を取ろうとする空のリストを返すまで、それはリストの最後で再帰的に呼び出し続けます。したがって、空の例外が発生します。

実際には非常に簡単に作成できます

fun before_reaching_sum_test (x::y::xs) = x :: before_reaching_sum_test(x+y::xs)
  | before_reaching_sum_test x = x

「前の数値を前に押して」、現在の合計を計算します。

アップデート

インパクトのためのブレース

fun before_reaching_sum_test xs =
    if null xs then xs (* empty list *)
    else if null (tl xs) then xs (* one element list *)
    else (* Two or more elements in the list *)
      let
        val x = hd xs
        val y = hd (tl xs)
      in
        x :: before_reaching_sum_test (x+y :: tl (tl xs))
      end

これは、実際には、パターンマッチングが優れている理由の良い例として役立ちます。

于 2013-02-10T02:18:43.020 に答える