💭コンピュータサイエンスと魔法のYコンビネータ 👨🏻🦳 エピローグ: コンピュータサイエンス 🍱の最後にあるjsをわかりやすくしてみる
まずは整形と階乗を計算する関数factorial
に分離
const factorial = (
a => {
return (
b => a(c => b(b)(c))
)(
b => a(c => b(b)(c))
)
}
)(
f => n => n === 0 ? 1 : n * f(n - 1)
)
factorial(4)
f
を受け取る関数に命名
function createRecursion (f) {
return n => n === 0 ? 1 : n * f(n - 1)
}
const factorial = (
a => {
return (
b => a(c => b(b)(c))
)(
b => a(c => b(b)(c))
)
}
)(
createRecursion
)
factorial(4)
createRecursion
が渡されているところの変数名変更
function createRecursion (f) {
return n => n === 0 ? 1 : n * f(n - 1)
}
const factorial = (
_createRecursion => {
return (
b => _createRecursion(c => b(b)(c))
)(
b => _createRecursion(c => b(b)(c))
)
}
)(
createRecursion
)
factorial(4)
b => _createRecursion(c => b(b)(c))
のところ命名
2つあるので_
つけて区別(念の為
function createRecursion (f) {
return n => n === 0 ? 1 : n * f(n - 1)
}
const factorial = (
_createRecursion => {
return (
warapCreateRecursion => {
return _createRecursion(c => {
return warapCreateRecursion(warapCreateRecursion)(c)
})
}
)(
_warapCreateRecursion => {
return _createRecursion(c => {
return _warapCreateRecursion(_warapCreateRecursion)(c)
})
}
)
}
)(
createRecursion
)
factorial(4)
上で命名したとこを共通にして分離してみる
function createRecursion (f) {
return n => n === 0 ? 1 : n * f(n - 1)
}
function wrappingCreateRecursion(_createRecursion) {
return warapCreateRecursion => {
return _createRecursion(c => {
return warapCreateRecursion(warapCreateRecursion)(c)
})
}
}
const factorial = (
_createRecursion => {
return (
wrappingCreateRecursion(_createRecursion)
)(
wrappingCreateRecursion(_createRecursion)
)
}
)(
createRecursion
)
factorial(4)
_createRecursion
がなくても大丈夫そうなのでなくしてみる
function createRecursion (f) {
return n => n === 0 ? 1 : n * f(n - 1)
}
function wrappingCreateRecursion(warapCreateRecursion) {
return createRecursion(c => {
return warapCreateRecursion(warapCreateRecursion)(c)
})
}
const factorial = wrappingCreateRecursion(
wrappingCreateRecursion
)
factorial(4)
yCombinator
としてwrappingCreateRecursion
を内包するようにしてみる
function createRecursion (f) {
return n => n === 0 ? 1 : n * f(n - 1)
}
function yCombinator(_createRecursion) {
function wrappingCreateRecursion(warapCreateRecursion) {
return _createRecursion((...args) => {
return warapCreateRecursion(warapCreateRecursion)(...args)
})
}
return (
wrappingCreateRecursion
)(
wrappingCreateRecursion
)
}
const factorial = yCombinator(createRecursion)
factorial(4)
wrappingCreateRecursion
の引数はなくても大丈夫みたい
function createRecursion (f) {
return n => n === 0 ? 1 : n * f(n - 1)
}
function yCombinator(_createRecursion) {
function wrappingCreateRecursion() {
return _createRecursion((...args) => {
return wrappingCreateRecursion()(...args)
})
}
return wrappingCreateRecursion()
}
const factorial = yCombinator(createRecursion)
factorial(4)