簡體   English   中英

使用lambda表達式在Scheme中定義函數的原因是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM