私がいくつかの機能を持っているとしましょう:
function g(a,b,c){ return a + b + c }
そして、それを「カリー化された」形式に変えたいと思います(それ自体は正確にカリー化されていないため、引用で):
function h(a,b,c){
switch(true){
case (a !== undefined && b !== undefined && c !== undefined):
return a + b + c
case (a !== undefined && b !== undefined && c === undefined):
return function(c){ return a + b + c }
case (a !== undefined && b == undefined && c === undefined ):
return function(b,c){
return (c === undefined) ? function(c){ return a + b + c } : a + b + c
}
default:
return h
}
}
上記のフォームには、私が望む部分バインディングの動作があります。
h(1) -> h(b,c)
h(1,2) -> h(c)
h(1,2,3) -> 6
h() -> h(a,b,c)
curry
ここで、このプロセスをいくつかの汎用関数に自動化して、カリー化されていない関数 (およびおそらくそのパラメーターの数) を指定すると、上記の関数が生成されるようにしたいと考えています。しかし、それを実装する方法がよくわかりません。
または、次のフォームが自動的に作成されると、それも興味深いでしょう。
function f(a,b,c){
return function(a){ return function(b){ return function(c){ return a + b + c }}}
}
バインディングf
は次のようになりますが:
f(1)(2)(3) = 6
そのため、非常に扱いにくく、慣用的ではありませんが、上記のフォームを作成する方が実現可能に思えます。
上記のフォームのいずれかが何らかの関数によって生成される可能性があります。