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