カレーを食べたくて入ってきた方々には申し訳ありませんが、
残念ながら、ここで言うカレーは インド料理のカレーではない です。
たまたま **カレーの英単語と同じスペル(Curry)**になっているだけです。
カレー(Curry) とは
ラムダ式を使って 複数引数を持つ関数 を 単一引数の関数に変換(Recuce)する手法です。
名前は、Haskell B. Curry. という方の名字( Curry )を取ったものです。
手法なので、Curry が動詞化され、正確には Currying と呼びます。
式で表すと、
f(n, m) --> f'(n)(m)
になります。
実例
- f(n, m)
multiply = (n, m) => (n * m)
multiply(3, 4) === 12 // true
- f'(n)(m)
curryedMultiply = (n) => ( (m) => multiply(n, m) )
triple = curryedMultiply(3)
triple(4) === 12 // true
どこで使われているの?
例をあげてみましょう
JavaScript Bind
Function.prototype.bind()
実は currying で実現されています。
increment = add.bind(undefined, 1)
increment(4) === 5
React and Redux
react-redux の connect()
関数が一番 カレー的 かもしれないですね。
export default connect(mapStateToProps)(TodoApp)
Event Handling
const handleChange = (fieldName) => (event) => {
saveField(fieldName, event.target.value)
}
<input type="text" onChange={handleChange('email')} ... />
Rendering HTML
enderHtmlTag = tagName => content => `<${tagName}>${content}</${tagName}>`
renderDiv = renderHtmlTag('div')
renderH1 = renderHtmlTag('h1')
Curryingの逆
当然、Curryingの逆となっている Uncurrying というのがあります。
式と実例も Currying のと逆ですが、
式
f(n)(m) --> f'(n, m)
実例
curryedMultiply = (n) => (m) => n * m
curryedMultiply(3)(4) === 12 // true
multiply = (n, m) => curryedMultiply(n)(m)
multiply(3, 4) === 12 // true
参考になったリンク
[javascript] Javascriptでカレーを作る | AI Fan 愛飯 (音量注意)
Currying in JavaScript ES6 – Bene Studio