gpt4 book ai didi

list - Haskell - 我自己的 zip3 函数

转载 作者:行者123 更新时间:2023-12-03 01:52:35 27 4
gpt4 key购买 nike

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

这就是我所拥有的:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com