2013-11-01 13 views
3

小陰謀家給出page 165以下的仍是功能長度。但這是如何工作的?它看起來像長度拉姆達被傳遞到MK-長度拉姆達,其與長度拉姆達本身作爲參數傳遞評估長度拉姆達。那麼,當(length (cdr l))底部評估length只是長度lambda本身。但是長度λ需要兩個curried參數:lengthl。那麼(length (cdr l))如何纔有意義呢?小策士:length0和MK-長度

((lambda (mk-length) 
    (mk-length mk-length)) 
(lambda (length) 
    (lambda (l) 
    (cond 
     ((null? l) 0) 
     (else (add1 
       (length (cdr l)))))))) 
+0

正確(在eternity功能潤色頁166的長度≤1使用);它沒有。它將'(lambda(l)...)'返回到'add1',從而導致錯誤;這就是爲什麼它是'length_0':它只適用於空列表。長度這個名字也是錯誤的,它應該被稱爲'mk-length' - 就像它在右邊一半那樣。 –

回答

5

的小策士正在建立,這將更大和更長的長度列表的操作功能。部分長度爲≤0的是它只適用於長度小於或等於零的列表(因爲沒有負長度列表,這意味着長度爲零的列表)。您已故意顯示的代碼僅適用於長度爲零的列表。事實上,這甚至在文中指出了page 165

答:如果我們能夠創建在這一點上MK-長度永恆的另一個應用程序?
B:這隻會將問題推遲到一個,此外,我們該怎麼做呢?
答:好吧,既然無人問津,我們傳遞給MK-長度什麼功能,我們可以通過它MK-長度開始。
B:這是正確的想法。然後我們調用mk-length永恆和這個結果cdr,這樣我們就能得到更多的塔。
答:那麼這仍然是長度

((lambda (mk-length) 
    (mk-length mk-length)) 
(lambda (length) 
    (lambda (l) 
    (cond 
     ((null? l) 0) 
     (else (add1 
       (length (cdr l)))))))) 

B:是的,我們甚至可以使用MK-長度代替長度

((lambda (mk-length) 
    (mk-length mk-length)) 
(lambda (mk-length) 
    (lambda (l) 
    (cond 
     ((null? l) 0) 
     (else (add1 
       (mk-length (cdr l)))))))) 

- 答: W hy我們想要那麼做嗎?
B:所有名稱相同,但有些名稱與其他名稱相同。
- 答:真:只要我們一致地使用名稱,我們就好。
B: And mk-length是一個遠比長度平等的名稱。如果我們使用像mk-length這樣的名稱,則不斷提醒mk-length的第一個參數是mk-length

page 166,作者表明,對於長度爲0或1的列表工作的版本(即,≤1)。最後,在page 167上,他們得到一個適用於任何長度列表的版本。如何作品進行了更詳細的另一個問題描述:

你也可以找到感興趣的下列問題:

+0

從之前的例子中,我會認爲長度爲0的作品只會意味着永久性地在任何非空列表中進入遞歸。因失去動態打字原因而失敗。但是,如果因爲非空列表的動態輸入原因而失敗,我認爲考慮「作品」是很奇怪的。 – user782220

+0

@ user782220是的,「作品」在這裏有點奇怪。記住這些代碼不是對已經工作的代碼進行持續改進和重構,這一點很重要。這本書提供了一個蘇格拉底對話,最終的代碼經過一系列的嘗試後逐漸被挑出來。 –