有没有更好的方法来重新创建这个函数?它编译得很好。
这就是我所拥有的:
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/