● カリー化を用いるとこんなことができる
○ 読みやすい高階関数の building block をつくる
○ 関数で DI する
○ 時間とともに変化する関数をつくる
7
話すこと
Slide 8
Slide 8 text
カリー化 (currying)
8
Slide 9
Slide 9 text
● n 引数関数を、n 回適用可能な 1 引数の連なりに変形すること
● 例
○ (a: number, b: number) => Math.max(a, b) が
○ (a: number) => (b: number) => Math.max(a, b) になる
○ a を渡すと、「b を渡すと number が返る関数」が返る
9
カリー化とは
Slide 10
Slide 10 text
// before
function getMax(a: number, b: number) {
return Math.max(a, b)
}
// after (curried)
function getMax(a: number) {
return function (b: number) {
return Math.max(a, b)
}
}
11
Slide 11
Slide 11 text
へー
(何が嬉しいのかわからん)
11
Slide 12
Slide 12 text
たとえば .filter と合わせる
12
Slide 13
Slide 13 text
例題)
number[] から 3 より
大きい要素だけを抽出せよ
13
Slide 14
Slide 14 text
// before
function isLarger(a: number, b: number) {
return a > b
}
// with before
const largerThanThrees = inputs.filter(function (n) { return isLarger(n, 3) })
11
Slide 15
Slide 15 text
これでも悪くないが
15
Slide 16
Slide 16 text
// after (curried)
function isLarger(a: number) {
return function (b: number) {
return a < b
}
}
// with after
const largerThanThrees = inputs.filter(isLarger(3))
11
Slide 17
Slide 17 text
// after (curried)
function isLargerThan(a: number) {
return function (b: number) {
return a < b
}
}
// with after
const largerThanThrees = inputs.filter(isLargerThan(3))
11
Slide 18
Slide 18 text
// after (curried)
function isLargerThan(a: number) {
return function (b: number) {
return a < b
}
}
// with after
const largerThanThrees = inputs.filter(isLargerThan(3))
11
● 関数の引数の一部だけ、予めある値を束縛しておくこと
○ 例: (a, b) => a + b があるとき、b=1 を部分適用すると increment 関数になる
● カリー化された関数に対し、予め
1回(あるいは数回)呼んでおくことでも実現できる
○ f が a => b => a + b のとき、f(1) すると b => b + 1 になる
○ isOwnedBy(user) に currentUser を適用すると isMine(item) が作れる
● カリー化と部分適用はよく混同される( 別の概念です )
25
部分適用とは