3

6章瞭解您一個Haskell,介紹了以下功能:懶惰在行動? (哈斯克爾)

zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c] 
zipWith' _ [] _ = [] 
zipWith' _ _ [] = [] 
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys 

筆者給出它的使用,我發現很容易遵循的幾個例子。那麼這一個:

ghci> zipWith' (zipWith' (*)) [[1,2,3],[3,5,6],[2,3,4]] [[3,2,2],[3,4,5],[5,4,3]] 

,輸出[[3,4,6],[9,20,30],[10,12,12]]

這是懶惰計算的例子嗎?我試着將zipWith'翻譯成Scheme(見下文)。我用「簡單」的例子來解決它,但不是最後一個例子,這讓我認爲Haskell的懶惰可能會帶來不同。

(define zipWith 
    (lambda (f listA listB) 
    (cond 
     ((null? listA) (quote())) 
     ((null? listB) (quote())) 
     (else (cons (f (car listA) (car listB)) (zipWith f (cdr listA) (cdr listB))))))) 
+3

不,這不是懶惰。它使用部分應用程序,這可能是一個不平凡的計劃(或不,我不知道多少計劃)。 –

+1

我認爲Daniel Fischer是對的。柯里格顯然可以用宏來模擬http://www.phyast.pitt.edu/~micheles/scheme/scheme14.html – jberryman

+0

@jberryman:我認爲這個鏈接就是我所需要的。如果您將此作爲答案發布,我很樂意爲您提供信用! – planarian

回答

2

jberryman的link在我原來的信息的評論中提供了最全面的答案。感謝所有回覆的人。

編輯在:如@newacct提到的意見,部分應用程序與平凡明確lambda建設,(lambda (x y) (zipWith * x y))實現lambda表達式都十分方案基本,我們不需要宏)

5

不,雖然這個例子會被懶惰地評估(就像Haskell中的其他函數一樣),但行爲並不依賴於此。在有限的列表中,它會以熱切的評價表現出相同的行爲。在無限列表中,當然,它永遠不會因急切的評估而終止,但懶惰評估允許您只評估所需的多個列表元素。

如果您發佈了用於調用Scheme zipWith代碼的代碼,也許我們可以幫助瞭解爲什麼它的行爲有所不同。

2

zipWith' (*) [1,2,3] [1..] 會(有使用)評估懶洋洋地