関数の定義では、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;