13

私はルビーでカリー化をしようとしています:

def add(a,b)
  return a+b
end

plus = lambda {add}
curry_plus = plus.curry
plus_two = curry_plus[2] #Line 24
puts plus_two[3]

エラーが発生します

func_test.rb:24:in `[]': wrong number of arguments (1 for 0) (ArgumentError)

func_test.rb:24:in` '

しかし、私がそうするなら

plus = lambda {|a,b| a+ b}

うまくいくようです。しかし、ラムダで割り当てた後にプラスを出力すると、どちらの方法でも同じタイプのオブジェクトが返されます。私は何を誤解しましたか?

4

3 に答える 3

18

あなたは正しい軌道に乗っています:

add = ->(a, b) { a + b }
plus_two = add.curry[2]
plus_two[4]
#> 6
plus_two[5]
#> 7

他の人が指摘したように、plus定義したラムダは引数を取らず、引数addなしでメソッドを呼び出します。

于 2013-08-29T02:12:22.783 に答える
10
lambda {|a,b| a+ b}

+2 つの引数を取り、最初の呼び出しの結果を返し、2 番目を引数として返すラムダを作成します。

lambda {add}

引数を取らず、引数なしで呼び出すラムダを作成しますがadd、これはもちろんエラーです。

やりたいことをやるには、やるべき

plus = lambda {|x,y| add(x,y)}

また

plus = method(:add).to_proc
于 2010-11-24T22:37:35.470 に答える
4

を記述するときlambda {add}は、引数をとらず、唯一のアクションとして引数なしで呼び出す Proc を宣言してaddいます。addProcにはなりません。一方、lambda {|a,b| a + b}は 2 つの引数を取り、それらを加算する Proc を返します。これは引数を取るため、引数をその 1 つに渡すことは有効です。

あなたが望むのは だと思いますmethod(:add).to_proc.curry

于 2010-11-24T22:36:41.130 に答える