[英]What's the reason for using lambda expressions to define functions in Scheme?
我正在閱讀Daniel Friedman撰寫的The Little Schemer一書。 我不明白為什么書中的每個函數都是用lambda表達式編寫的。
(define fun1
(lambda (x1 x2)
(+ x1 x2)))
(define (fun2 x1 x2)
(+ x2 x2))
這兩個功能做同樣的事情,但第二個功能更整潔。 我很好奇在各地使用lambda的原因。
在這種情況下我使用了DrRacket。
(define (x . a) ...)
只是一個縮寫
(define x (lambda a ...))
在1975年的第一個方案報告中,你沒有這個縮寫。 在1978年的修訂報告中,它被引入。
這個小小的Schemer只是1974年的The Little Lisper的后期版本。它早於Scheme,當它被修復為遵循Scheme時,他們試圖保持盡可能接近原始版本。 此外,當你使用(define x (lambda (arg1) ...))
,很明顯,過程綁定與其他變量綁定沒有區別,除了它指向的對象是閉包代碼而不是數據。
如果你看看SICP視頻講座,你會發現Abelson和Sussman確實有學生對此感到困惑,所以最好只使用其中一個,因為匿名程序是你需要觸摸的東西,很明顯你想教帶有顯式lambda而不是語法糖的形式。
這只是一種風格問題。 在The Little Schemer中,作者決定使用lambdas顯式聲明過程,以明確函數定義為過程賦予一個名稱(它只是一個帶有值的表達式,就像任何其他過程一樣)。
聲明函數(沒有顯式lambdas)的另一種方式是完全等效的,它只是語法糖。 有人可能會爭辯說,作者為教學而非實際原因選擇了更明確的語法。
lambda表達式是一個函數文字,就像3(例如)是一個整數文字。 你可以想象一種編程語言,你不能在一個更大的表達式中使用3,但必須定義一個變量並將其初始化為3.它仍然可以工作,但它會帶來不便並妨礙你。 大多數語言都與函數一樣(它們只能被定義一次,然后被調用),但是函數式語言可以讓你像處理任何其他變量一樣處理函數,包括能夠從字面上引用它們。
就像你需要一個特定的整數但不需要打擾變量時使用整數文字一樣,當你需要一個函數但不需要打擾它時,你可以使用一個lambda表達式。
常見的用途是使用mapcar這樣的函數,它將函數作為參數並將該函數應用於另一個參數中的所有元素。 有時您只想將一次性功能拋入其中而無需命名。
只看這個特定的例子,我猜他們會指出scheme和lisp之間的區別(lisp做的有點不同)。
我自己剛剛完成The Little LISPer 。 最初,我很困惑為什么他們使用這個奇怪的習語。 正如你所說,后者是前者的糖,當然看起來更整潔,那么到處使用匿名函數有什么意義呢?
從教育學的角度來看,我認為它為讀者做好了准備,最后的章節涵蓋了currying,高階函數,lambda演算等等。 特別是,應用順序Y組合子的推導需要在其他環境中使用你可能稱之為“不必要的函數包裝”的東西。 通過倒數第二章,你對這個程序非常熟悉,推出Y-combinator並不比倒咖啡或做吐司更困難。 好吧 - 不是真的,但我認為作者采用的風格無疑會讓你更接近理解這個難題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.