haskell - 为什么 zip 在参数计数方面不是通用的?

标签 haskell generics

Haskell 新手在这里。我的观察是:

  • zipzip3 是重要的函数 - 包含在 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/

相关文章:

haskell - Lambda 微积分 (λa.b)((λx.xx)(λx.xx))

java - : <T> ReturnContainer test() and: <T> ReturnContainer<T> test()? 之间的区别

java - 用java编写一个contains方法

haskell - IntelliJ Haskell 插件 : ghc-modi failed with error

java - 如何使用泛型在 Java 中创建通用方法?

Java - 使用通配符列表创建数组列表

c# - IList<T> 与 Collection<T> 作为属性

Haskell 类型错误(短代码)

Haskell:具有类类型参数的类实例

haskell - GHC:静态链接 ARM 和 MIPS 处理器的 Linux 二进制文件