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

Vor*_*rac 3 generics haskell

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

  • zip并且zip3是重要的功能 - 包含在前奏中,由许多其他语言实现,代表了数学中的常见操作(换位)

  • 在参数结构方面不通用

  • 易于用传统语言实现 - C或C++(比如20小时工作); python已经将它作为内置版本

为什么zip这么受限制?有抽象,概括吗?n大小的元组出了什么问题?

Dan*_*ner 6

因为建议的副本回答了大部分内容,所以我将重点关注您的后续评论中的问题.

1)为什么固定n = 2的标准实现

zipWith用于2个参数,repeat用于0个参数.这足以获得任意的拉链.例如,1参数版本(也称为map)可以实现为

map f = zipWith ($) (repeat f)
Run Code Online (Sandbox Code Playgroud)

和3参数版本

zipWith3 f = (.) (zipWith ($)) . zipWith f
Run Code Online (Sandbox Code Playgroud)

等等.较大拉链的实现有一个很好的模式(从这个小样本大小来看,这一点并不明显).这个结果类似于CT中的结果,即任何具有0元和2元产品的类别都具有所有有价值的产品.

我想,答案的另一半是类型级数(这是任意arips拉链最常用的实现技术)是可能的但是使用起来很烦人,并且避免它们往往会降低术语和类型级别噪声.

2)我需要传递列表的数量,这是笨重的

使用ZipList.你不需要传递列表的数量(虽然你需要为每个列表编写一个中缀运算符 - 我认为这是一个非常轻的要求,因为即使在Python中你需要在每个列表之间使用逗号).

凭经验:我没有发现任意性拉链这样的共同需求,我会将其标记为"笨重".

3)即使我定义了自己的zip,也会与Prelude.zip发生冲突.

那么选择另一个名字......?