簡體   English   中英

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) ...)))

模式完全是列表的“遞歸”定義,如下:

  • 一個空列表,或
  • 具有至少一個元素(汽車)和列表(cdr)的值。

新定義改為將兩個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.

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