関数をcurry化して処理を先送り

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化することで、先送りする引数位置を調整することもできます。