在Learn You a Haskell的第6章中,介绍了以下功能:
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)))))))