為什麼lambda演算中,函數在定義上只允許一個參數,而有時卻又會有多個參數的寫法呢?
01-06
在lambda演算的函數定義上,一個函數只帶一個參數.
但又有多個參數的寫法.例如這樣的:lambda x y .(...)感覺簡直看不下去,自己定義的規則自己不遵守,是不是很不嚴謹?怎麼看待這一點?
這是我產生問題的地方:我看這個比看維基百科的解釋更容易理解,但是產生了疑惑啦:翻譯 - 負暄瑣話
最最純正的lambda演算是只有一個參數的,有多個參數的lambda演算可以看作是單參數lambda演算的語法糖,所有多參數函數都可以轉化為多個單參函數的嵌套。比如 ==&>。這個過程叫做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 calculuslambda calculus its syntax and semanticslambda calculus and combinators, an introductioncurrying
- 函數還是集合到集合的映射;
- 函數有一元函數和多元函數,對於多元函數,相當於把每一個變元的定義域求了笛卡爾積,如果不單獨討論每一個變元的關係,多元函數和一元函數沒有很多的區別。
- 同樣也有另外一種方法叫作柯里化(Currying),可以將多元的lambda轉化為一元的lambda。
- 在柯里化這一節之後講到:為了簡單起見,本書(語義學或者其他同類教材)後面的例子均以一元函數為例,不再對多元函數進行討論。
它比維基百科好理解那你應該先理解之後再去看維基百科,那裡有相對嚴謹的陳述。另外編程是學來用的,不是么~
推薦閱讀:
※比較兩個lambda表達式是否等價的lambda表達式怎麼寫?
※函數式編程語言的「天然支持並行與並發」是不是吹牛?
※Y不動點組合子用在哪裡?
※Erlang學習需要什麼基礎?
※為什麼常說的「五代編程語言」(機器、彙編、面向過程、面向對象、智能)中沒有函數式語言的位置?