2011-07-30 8 views
2
ここ

は、私がこの電子ブック(http://www.cs.cornell.edu/riccardo/prog-smlnj/notes-011001.pdf)は理解が

-fun curry (f:'a * 'b -> 'c) = fn (x:'a) => fn (y:'b) => f (x,y); 
val curry = fn : ('a * 'b -> 'c) -> 'a -> 'b -> 'c 

方法からピックアップ一例であるカリー化についてのヘルプが必要です私はこの機能を解釈しますか?カレーは引数として 'a *' b - > 'c型の関数fをとります。私は '='の後の部分を理解できません。結合順序は何ですか?ここで

は別の例である:

fun add’ (x:int) (y:int):int = x + y; 

これが解析される方法は?

ウィキペディアでは、「カリー化は、引数が1つの関数の連鎖として呼び出すことができるように、複数の引数(またはn個の引数のタプル)をとる関数を変換する技法です)」。単一の議論はどれですか:複数の議論のうちの最初か最後の議論ですか?

+0

で得られた関数を呼び出し、(foo 1) 2として解析されるであろう。だから、これはあなたを助けるかもしれないhttp://stackoverflow.com/questions/3794371/haskell-currying-need-further-explanation – Matt

+0

@マット:私はそれを読んだ後にもっと混乱しました:)リンクをありがとう。 – Bruce

答えて

2

fn (x:'a) => fn (y:'b) => f (x,y)は、fn (x:'a) => (fn (y:'b) => f (x,y))として解析されます。だからあなたはa型の引数xをとり、b型の引数yをとる関数を返します。この他の関数は、f (x,y)を呼び出した結果を返します。

fun foo x y = ...val foo = fn x => fn y => ...の構文砂糖です。したがって、fooは1つの引数xをとり、もう1つの引数yを取る関数です。

同様コールfoo 1 2、すなわち、それは引数1と機能fooを呼び出して、私はHaskellので同じ質問があった引数2

+0

@ sepp2k:私はSMLで始めました。私が使用できる良いリソース(本、オンライン資料)をお勧めしますか? – Bruce