Haskell 新手在这里。我的观察是:
zip
和zip3
是重要的函数 - 包含在 Prelude 中,由许多其他语言实现,代表数学中的常见操作(转置)在参数结构方面不是通用的
易于用传统语言实现 - C 或 C++(比如 20 小时工作); python已经将它作为内置
zip
为何如此受限?有没有抽象,概括它? n 大小的元组有问题吗?
最佳答案
由于建议的重复项回答了大部分问题,因此我将重点关注您后续评论中的问题。
1) why is the standard implementation for fixed n = 2
zipWith
用于 2 个参数,repeat
用于 0 个参数。这足以获得任意数量的 zipper 。例如,1 参数版本(也称为 map
)可以实现为
map f = zipWith ($) (repeat f)
和 3 参数版本为
zipWith3 f = (.) (zipWith ($)) . zipWith f
等等。较大的 zip 的实现有一个漂亮的模式(诚然,从这个小样本量来看并不明显)。这个结果类似于 CT 中的结果,即任何具有 0 元和 2 元产品的类别都有所有有限产品。
我想,答案的另一半是类型级别的数字(这是任意数量 zip 最常见的实现技术)是可能的,但使用起来很烦人,避免使用它们往往会减少术语和类型级噪声。
2) I need to pass the number of lists, that's unwieldy
使用 ZipList
。您不需要传递列表的数量(尽管您确实需要为每个列表编写一个中缀运算符——我认为这是一个非常简单的要求,因为即使在 Python 中您也需要在每个列表之间使用逗号)。
根据经验:我还没有发现任意数量的 zip 如此普遍的需求,以至于我将其标记为“笨拙”。
3) even if I define my own zip, there will be collisions with Prelude.zip.
所以选择另一个名字...?
关于haskell - 为什么 zip 在参数计数方面不是通用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43520756/