![](/img/trans.png)
[英]Is there an example of the "align" function from The Little Schemer?
[英]The Little Schemer: What is a function or argument's structure?
在The Little Schemer的第3章中,關於為什么我們不立即簡化rember函數的問題的答案是“因為那時函數的結構與其參數的結構不一致”。 我無法理解函數的結構是什么,參數的結構是什么,以及它們之間的區別。
這是未簡化的版本:
(define rember
(lambda (a lat)
(cond
((null? lat) (quote ()))
(else (cond
(( eq? (car lat) a) (cdr lat))
(else (cons (car lat)
(rember a
( cdr lat)))))))))
這是簡化的:
(define rember
(lambda (a lat)
(cond
((null? lat) (quote ()))
((eq? (car lat) a) (cdr lat))
(else (cons (car lat)
(rember a (cdr lat)))))))
據我所知,主要的不同之處在於,這個功能已經從兩個問題變成了一個問題,每個問題一個問題,一個問題得到兩個問題。
函數的參數是原子“a”和列表“lat”。
這是第一次在密集書面的前言之外,書中引用了“結構”這個詞。 在我看來,到目前為止,“結構”一詞的定義可以解釋。
之前有人問過這個確切的問題 ,但我無法回答這個問題。 為什么兩個cond結構與列表的結構重合或不重合? 在我看來,清單根本沒有任何條件!
不是條件相當於Scheme中的問題嗎? 也許我誤解了條件是什么,這可能是我沮喪的合理根源。 無論如何,對此的任何澄清將非常感謝! 謝謝!
這里對於“函數結構”,作者可能意味着函數體,即條件:
(cond
((null? lat) ...)
(else ... (cond... (car lat) ... (cdr lat) ...)))
模式完全是列表的“遞歸”定義,如下:
新定義改為將兩個cond“折疊”在一個cond中,因此函數的“結構”( cond
的結構)不再反映其list參數的“結構”。
List是一個可以定義的類型,帶有一些偽代碼,如
(define-variant-record list
( () ) ; '() is a list
((hd . tl) ; a cons pair (with car field named `hd` and cdr `tl`)
(list tl)) ) ; is a list, if `tl` itself is a list
然后,可以使用假設(參見EOPL)模式匹配構造variant-case
來處理它:
(define rember
(lambda (a lat) ; an atom and a list of atoms
(variant-case (lat) ; follow the `lat` --
( () ; an empty list case, or
(quote ()))
( (hd . tl) ; a non-empty list, with car field `hd` and cdr `tl`
(cond
(( eq? hd a) tl)
(else
(cons hd
(rember a tl))))))))
通過使用屬於list
的數據類型定義的variant-case
,其自然且可見地遵循其結構 (即其定義的兩個案例)。
第一個公式(帶有嵌套的cond
)只是模擬了不存在的variant-case
具有對具體數據類型實現的顯式訪問權限,其中包括car
s和cdr
s。
內部cond
不屬於這個,只是自己處理rember
的細節。 這就是為什么將兩個cond
混合成一個可能被視為將不相關的問題混合成一個混合物(一般來說;雖然這里都非常簡單明了)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.