4

私はGroovyを始めたばかりで、Haskell、C ++、および少しのJavaのバックグラウンドから来ています。

次のようなクロージャーを書いたとしましょう。

def mult = { x, y -> x * y }

後で書くことができますmult(3,5)

しかし、書くmult(3)と、コンパイルエラーが発生します。

もちろん書くこともできますmult.curry(3)が、それは少し醜いようです。

だから私はこのアプローチを試すことができます:

def mult = { x -> { y -> x * y }}

これでmult(3)問題なく動作しますが、2つの数値を乗算するには、2つの数値を乗算するように書き込む必要がありmult(3)(5)ます。

私が欲しいのは、両方の長所です。mult(3)、、を書けるようにmult(3,5)なりたいですmult(3)(5)。とにかく、クロージャをこのように動作させるには?

4

1 に答える 1

5

あなたはあなたの閉鎖を「currify」するためにこのようなものを作ることができます:

def currify(fn) {
    { Object... args ->
        if (args.size() == fn.maximumNumberOfParameters) {
            fn(*args)
        } else {
            currify(fn.curry(*args))
        }
    }
}

def mult = currify { x, y -> x * y }
def twice = mult(2)

assert mult(2, 5) == 10
assert twice(5) == 10
assert mult(2)(5) == 10
于 2013-01-25T04:20:12.193 に答える