在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)))))))
不,這不是懶惰。它使用部分應用程序,這可能是一個不平凡的計劃(或不,我不知道多少計劃)。 –
我認爲Daniel Fischer是對的。柯里格顯然可以用宏來模擬http://www.phyast.pitt.edu/~micheles/scheme/scheme14.html – jberryman
@jberryman:我認爲這個鏈接就是我所需要的。如果您將此作爲答案發布,我很樂意爲您提供信用! – planarian