Lean Functional Programming with Javascript (in Japanese).
This slide introduce 1. Anonymous Function 2. Lexical Scope 3. Referential Transparency 4. Higher Order Function 5.Currying 6.Function Composition 実用的でないという意味ではありません。
17. 再帰関数
for や while でのループは再代入を伴うため、関数型プログラミングでは使用されない
(拡張 for 文は再代入が伴わないので、OK? )
その代わりに再帰関数で実現する(初めはとっつきにくいけど、慣れると for 文等より
理解しやすい)
def sum(init: Long, from: Int, to: Int): Long = {
if (from == to) init + to
else sum(init + from, from + 1, to)
}
sum(0, 1, 10) // 55
18. 再帰関数の作り方
1. 必要な情報(関数シグネイチャー)を考える
2. 停止条件を考える
3. それ以外の場合の処理を考える
def sum(init: Long, from: Int, to: Int): Long = { // ①
if (from == to) init + to // ②
else sum(init + from, from + 1, to) // ③
}
26. 部分適用
部分適用とは、カリー化された関数に一部のみ引数を適用すること。
これにより、処理の冗長性を排除できる
def add(x: Int, y: Int): Int = {
x + y
}
// 第一引数に必ず 1 が渡される場合
val test1 = add(1, 1)
val test2 = add(1, 2)
val test3 = add(1, 3)
val test4 = add(1, 4)
def add(x: Int)(y: Int): Int = {
x + y
}
val add1 = add(1) _ // add1: Int => Int = <function>
val test1 = add1(1)
val test2 = add1(2)
val test3 = add1(3)
val test4 = add1(4)