curry化は、言葉の説明より動作確認したほうが意味がわかりやすいです。そこで、Javascriptでcurry化された関数を作ってみます。動作確認を通じて、curry化の概念やメリットを確認します。
目次
Ramda.jsをインストール
curry化の概念を理解したいだけなので、関数をcurry化するための処理は外部ライブラリを利用します。
ここでは、関数型プログラミング用のライブラリである Ramda.js
をインストールしてみます。
Ramda.jsでは、関数をcurry化するためメソッドが提供されています。
yarn add ramda
参考
https://ramdajs.com/
https://github.com/ramda/ramda
関数をcurry化してみる
Ramda.jsで関数をcurry化するには、curryメソッド
または、 curryNメソッド
を利用します。
参考
https://ramdajs.com/docs/#curry
https://ramdajs.com/docs/#curryN
動作確認
const R = require('ramda')
const print = (a, b, c) => `${a}_${b}_${c}`
// e.g.) 1. curry化されてない関数
console.log('-----------------------')
console.log(print(1, 2))
// e.g.) 2. curry化
console.log('-----------------------')
const curriedPrint = R.curry(print)
f = curriedPrint('aaa', 'bbb')
console.log(f('ccc'))
console.log(f('ddd'))
// e.g.) 3. curry化
console.log('-----------------------')
const curriedPrintN = R.curryN(3, print)
f = curriedPrintN(R.__, 'aaa', 'bbb')
console.log(f('ccc'))
console.log(f('ddd'))
-----------------------
1_2_undefined
-----------------------
aaa_bbb_ccc
aaa_bbb_ddd
-----------------------
ccc_aaa_bbb
ddd_aaa_bbb
e.g. | 補足 |
---|---|
1 | curry化されてないので、引数が足りなくても、関数を呼び出した時点で処理が実行されます。足りない引数は、 undefined となります。 |
2 | curry化されたので、引数が足りない場合、処理が先送りされます。 |
3 | curryNメソッド でcurry化することで、先送りする引数位置を調整することもできます。 |