我熟悉在ADD函式之上定義SUCC函式,如下所示:
const ONE = f => a => f(a);
const SUCC = n => f => a => f(n(f)(a)); // SUCC = λnfa.f(nfa)
const ADD = n1 => n2 => n1(SUCC)(n2); // ADD = λnk.n SUCC k
console.log(ADD(ONE)(ONE)(x => x 1)(0));
// 2
但是,如果沒有定義后繼函式,我將如何定義 add ?我嘗試使用替換來獲得以下內容,但我不確定為什么它不起作用。我在這里搞砸了什么?
const ONE = f => a => f(a);
const ADD = n1 => n2 => f => a => n1(f(n1(f)(a)))(n2);
console.log(ADD(ONE)(ONE)(x => x 1)(0));
// TypeError: f is not a function
uj5u.com熱心網友回復:
const ADD = n1 => n2 => n1(n => f => a => f(n(f)(a)))(n2)
// ADD = λnk.n (λnfa.f (n f a)) k
這也可以 eta 減少到
const ADD = n1 => n1(n => f => a => f(n(f)(a)))
// ADD = λn.n (λnfa.f (n f a))
進行替換時,只需將要替換的術語替換為其定義:
n1 => n2 => n1(SUCC)(n2)- 的定義
SUCC:n => f => a => f(n(f)(a)) - 替換
SUCC為上述定義:n1 => n2 => n1(n => f => a => f(n(f)(a)))(n2)
您可以定義的另一種方式ADD是這樣的:
const ADD = m => n => f => x => m(f)(n(f)(x))
// ADD = λmnfx.m f (n f x)
Church 數字m和n可以被看作是一個函式f并產生另一個應用f特定次數的函式。換句話說,n(f)可以看作是“重復f n次數”。
因此,ADD(m)(n)應該回傳一個重復一個函式m n次的函式。
const ADD =
m => // first number
n => // second number
f => // function to be repeated
x => // value
(
m(f) // 2. then apply f m times
(n(f)(x)) // 1. apply f n times
)
ADD(ONE)也等同于SUCC(如您所料):
ADD(ONE)(m => n => f => x => m(f)(n(f)(x)))(ONE)(定義ADD)n => f => x => ONE(f)(n(f)(x))(β減少)n => f => x => (f => a => f(a))(f)(n(f)(x))(定義ONE)n => f => x => (a => f(a))(n(f)(x))(β減少)n => f => x => f(n(f)(x))(β減少)SUCC(定義SUCC)
有關更多資訊,請參閱Wikipedia 上的“教堂編碼”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454834.html
標籤:javascript 函数式编程 λ演算
上一篇:將變數設定為方法
