2

標準 ML を使用して、リスト内の最大値を見つけようとしています。指定された折り畳み関数を使用する必要があります:

 fun fold f [] base = base
   | fold f (x::xs) base = fold f xs (f x base);

これが私がこれまでに持っているものです:

fun max (x::xs) = fold (fn (a, b) => if a > b then a else 0) x (x::xs);

リストが空の場合は 0 を返す必要があるため、そこには 0 があります。これは、定義する必要がある別の関数の一部にすぎませんが、折りたたみ部分に苦労しています。

4

1 に答える 1

3

関数の定義では、fold関数fがカレー形式で引数を取る必要があります。つまり、。f 1 1 の代わりに:ですf(1,1)

私が理解しているように、fold関数の定義は正しいものです。したがって、関数内の無名関数に適切な変更を加える必要がありmaxます。

SMLでは、カリー化は実際には単なる糖衣構文です。例えば:

fun foo a b = a+b

(脱糖後)として終わるでしょう:

val rec foo = fn a => fn b => a+b

また、2つの関数のタイプが同じであることがわかります。

- fun foo a b = a+b;
val foo = fn : int -> int -> int
- val rec foo = fn a => fn b => a+b;
val foo = fn : int -> int -> int

したがって、無名関数は同じ線に沿っていくらか定義する必要があります。

また、への引数を混合しましたfold。関数の最後の部分では、最後maxの2つの引数を逆の順序で指定しています。

最後の問題は、無名関数が0を返すことです。これにより、無名関数の不変条件がねじ込まれ、場合によっては失敗します。例えば:

max [1,4,65,7,6];

自分で理由を理解してみてください。

の入力リストが空の場合に本当に0を返す必要maxがある場合は、その場合にパターンマッチする必要があります。これにより、「完全ではない一致」に関する警告も修正され、これを行うのに適切な場所になります。

fun max [] =  0
  | max (x::xs) = fold (fn a => fn b => if a > b then a else b) (x::xs) x;
于 2012-11-14T10:29:00.220 に答える