為什麼lambda演算中,函數在定義上只允許一個參數,而有時卻又會有多個參數的寫法呢?

在lambda演算的函數定義上,一個函數只帶一個參數.

但又有多個參數的寫法.

例如這樣的:

lambda x y .(...)

感覺簡直看不下去,自己定義的規則自己不遵守,是不是很不嚴謹?

怎麼看待這一點?

這是我產生問題的地方:

我看這個比看維基百科的解釋更容易理解,但是產生了疑惑啦:

翻譯 - 負暄瑣話


最最純正的lambda演算是只有一個參數的,有多個參數的lambda演算可以看作是單參數lambda演算的語法糖,所有多參數函數都可以轉化為多個單參函數的嵌套。比如lambda x y. x+y ==&>lambda x. (lambda y. x + y)。這個過程叫做Currying。

另外建議樓主直接看那個英文博客,把lambda caculus部分全看完。


簡單來說,lambda x y z w. fuck就是lambda x.lambda y.lambda z.lambda w.fuck的縮寫。函數調用同理。


其實道理很簡單,完全不需要提出這麼多概念,這麼說吧,如果f(x)返回的值其實就是一個函數,那麼f(x)(y)這種寫法是不是完全合理呢,所以你把(lambda (x y) (+ x y))看成(lambda (x) (lambda (y) (+ x y)))的簡寫就好了,更多參數的情況依此類推... 這跟lambda演算只接受單參數並不矛盾。(當然你說這就是可以接受多參也並無不可,之所以規定為單參僅是為了形式上的簡潔)

PS:相關概念:第一類函數(first class function),科里化(currying)


可以算糖 理論上的一個參數是脫糖處理的結果


題主你聽說過柯里化嗎?

另外在書寫的時候為了方便一般會有:

λ x y z … . M ? λ x . λ y . λ z . … . M

這種簡寫


一個函數確實只需要一個參數。

但是多個參數寫起來比較方便。

而多個參數的lambda表達式又可以轉化為一個參數的lambda表達式。

比如lambda x y.xy 就可以寫成 lambda x.(lambda y.(xy))。

多參數的形式可以看作一個參數的語法糖,為了書寫和閱讀方便。


「有時候有多參數的寫法」?編程語言里可以有多參數的lambda表達式;有的語言里多參數lambda表達式獲得的匿名函數,有n個參數,調用時必須給n個參數,沒有currying(比如Python),而有的語言里多參數lambda表達式會自動變成currying的形式。(Haskell等大多數函數式語言)

但是lambda演算本身是只有單參數的。題主選錯教程了。如果不理解currying、高階函數、閉包幾個概念,建議先不要學lambda演算。


lambda演算是支持多參數的,並且有特定的計算過程,也就是按照參數傳遞的順序從裡到外一層層規約。

詳細參考,

http://mp.weixin.qq.com/s?__biz=MzIwMDgyNzUzNw==mid=2247483658idx=1sn=2dde89033d2fef0cba307db9b8b5489escene=0#wechat_redirect


你說的應該是currying。

有三本有關lambda calculus的書網上可以下:

introduction to lambda calculus

lambda calculus its syntax and semantics

lambda calculus and combinators, an introduction


currying


  1. 函數還是集合到集合的映射;
  2. 函數有一元函數和多元函數,對於多元函數,相當於把每一個變元的定義域求了笛卡爾積,如果不單獨討論每一個變元的關係,多元函數和一元函數沒有很多的區別。
  3. 同樣也有另外一種方法叫作柯里化(Currying),可以將多元的lambda轉化為一元的lambda。
  4. 在柯里化這一節之後講到:為了簡單起見,本書(語義學或者其他同類教材)後面的例子均以一元函數為例,不再對多元函數進行討論。


它比維基百科好理解那你應該先理解之後再去看維基百科,那裡有相對嚴謹的陳述。

另外編程是學來用的,不是么~


推薦閱讀:

比較兩個lambda表達式是否等價的lambda表達式怎麼寫?
函數式編程語言的「天然支持並行與並發」是不是吹牛?
Y不動點組合子用在哪裡?
Erlang學習需要什麼基礎?
為什麼常說的「五代編程語言」(機器、彙編、面向過程、面向對象、智能)中沒有函數式語言的位置?

TAG:函數式編程 | 形式邏輯 | Lambda表達式 | 形式科學 | Lambda演算 |