0

i 数値のリストが与えられた場合、 index の要素が の前のすべての要素の合計である新しいリストを作成したいと考えていますi-1

例えば ​​:

[1,4,6,9] ->  [1,5,11,20]

私は次のコードを書きました:

fun sum nil = 0 
| sum [x]=x 
| sum(x::rest)=(x+hd(rest))::sum(rest);

しかし、私はこれを得ました:

- fun sum nil = 0
= | sum [x]=x
= | sum(x::rest)=(x+hd(rest))::sum(rest);
stdIn:306.16-306.39 Error: operator and operand don't agree [literal]
  operator domain: int * int list
  operand:         int * int
  in expression:
    x + hd rest :: sum rest

の再帰規則が(x+hd(rest))::sum(rest);問題の原因であることがわかりますが、どうすれば修正できますか?

よろしく

4

1 に答える 1

5

基本ケースを見てください。関数がリストを返すようにしたいので、基本ケースはリストを返す必要があります。

fun sum []      = []
  | sum [x]     = [x]
  | sum (x::xs) = ...

私はそれがもっと好きなので置き換えnilました-それは本当に問題ではありません。[]

もう1つのこと-and演算子は絶対に使用しないhdtlください(例外はありますが、今のところは使用しないでください)。確かに、あなたの職務では、問題が発生する場合は問題に対処しているので問題にはなりませんが、別の理由があります。これを行う場合:

fun foo [] = ...
  | foo (x::y::xs) = ...

SMLは、パターンマッチングが完全ではないこと、つまり、見逃したパターンがあることを通知します。つまり、実行時ではなくコンパイル時にエラーをキャッチします。

これが機能する関数のバージョンです。

fun sum [] = []
  | sum [x] = [x]
  | sum (x::y::xs) = x::sum (x+y::xs)

再帰呼び出しに追加を移動しました。最初に追加すると、結果の最初の要素が、一緒に追加された元のリストの最初の2つの要素になるためです。

于 2013-02-17T17:30:17.907 に答える