list - Haskell - 我自己的 zip3 函数

标签 list haskell zip tuples

有没有更好的方法来重新创建这个函数?它编译得很好。

这就是我所拥有的:

zip3' :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3' [] _ _ = []
zip3' _ [] _ = []
zip3' _ _ [] = []
zip3' (a:as) (b:bs) (c:cs) = (a,b,c) : zip3' as bs cs

我只是想知道是否有更好的方法来总结这一点:

zip3' [] _ _ = []
zip3' _ [] _ = []
zip3' _ _ [] = []

最佳答案

效果很好。如果你想让程序变得更短,你可以这样写:

zip3' :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3' (a:as) (b:bs) (c:cs) = (a,b,c) : zip3' as bs cs
zip3' _      _      _ = []

因为只有当三个列表中至少有一个不是 (_:_) 时,第一行才会触发失败(因此 [])。但这有时被视为一种反模式,因为在一种非常不同的情况下,即向列表数据类型添加构造函数,这可能会得到一个空列表(而在这种情况下,我们可能最好得到一个错误)。我同意对于列表来说这几乎是不可能的:许多库和程序将不再工作。但一般来说,您设计一种数据类型,然后改变主意并添加额外的构造函数的情况并不罕见。

如果我们检查zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]的源代码,然后我们看到它是这样实现的 [source] :

zip3 :: [a] -> [b] -> [c] -> [(a,b,c)]
-- Specification
-- zip3 =  zipWith3 (,,)
zip3 (a:as) (b:bs) (c:cs) = (a,b,c) : zip3 as bs cs
zip3 _      _      _      = []

出于某种原因,zip 本身是以“问题”样式实现的 [source] :

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

关于list - Haskell - 我自己的 zip3 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48102083/

相关文章:

python - 如何将字典列表保存到文件中?

Python - 取消嵌套字典列表

scala - 将列表映射拆分为映射列表的功能方法

haskell - Monad Transformer 与将参数传递给函数

c++ - 可以在 Windows 上创建受密码保护的 zip 文件的 C zip 库?

list - 如何将列表从子类泛型转换为父类泛型?

c - 列表 vector 打印不起作用

python - 使用 Python 将文件列表添加到 zip 文件中

haskell - (r ->) 应用仿函数

java - 如何在 Java 中找到 ZipFile 条目的文件偏移量?