haskell - Haskell 中的 zip 函数

标签 haskell recursion implementation

一个 zip 函数的实现,它接受两个列表作为参数并返回一个新的对列表。到目前为止我得到了这个

myZip [] [] = []
myZip (x:xs) (y:ys) = [(x,y)] ++ myZip xs ys

有什么帮助吗?

最佳答案

实际上只有一种方法可以为列表编写它,即使是家庭作业:

zip :: [a] -> [b] -> [(a,b)]
zip (a:as) (b:bs) = (a,b) : zip as bs
zip _      _      = []

或者,更一般地说,
zipWith :: (a -> b -> c) -> [a]->[b]->[c]
zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
zipWith _ _      _      = []

如果你想变得古怪,玩流融合,流融合论文的版本,自动机风格,
zipWith :: (a -> b -> c) -> Stream a -> Stream b -> Stream c
zipWith f (Stream next0 sa0) (Stream next1 sb0) = Stream next (sa0, sb0, Nothing)
  where
    next (sa, sb, Nothing) = case next0 sa of
        Done        -> Done
        Skip    sa' -> Skip (sa', sb, Nothing)
        Yield a sa' -> Skip (sa', sb, Just a)

    next (sa', sb, Just a) = case next1 sb of
        Done        -> Done
        Skip    sb' -> Skip          (sa', sb', Just a)
        Yield b sb' -> Yield (f a b) (sa', sb', Nothing)

关于haskell - Haskell 中的 zip 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5776322/

相关文章:

c++ - 未实现的 Tesseract 函数

c++ - 继承, parent 在 C++ 中访问 child

algorithm - 剥离填充后解码base64

multithreading - Data.ByteString.readFile 是否阻塞所有线程?

haskell - 有没有办法在 Persistent Haskell 中没有任何过滤器或选择选项的情况下选择列表?

Java - 三角形的递归和

python - 决策树中的递归编程

haskell - 如何在 Yesod/Persistent 中正确使用 runDB

haskell - "Wither"的 Profunctor 表示是什么?

list - 在 Common Lisp 的 2 个列表中递归应用函数