6

重新定义函数很简单

(,) :: a -> b -> (a,b)
(,) a b = (a,b)

奇怪的(对我来说)是这个函数是为任意长度的元组定义的。因此,例如,实际上有一个函数:

(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a -> b -> c -> ... -> (a,b,c,...)

这是怎么做到的?为什么不为元组上的所有标准函数完成它,比如 zip?

Hoogle 没有给我任何结果,而且我看不到 Haskell 模板是如何做到这一点的,所以我认为它一定是编译器内部的某种魔法。但这对我来说似乎很不合时宜。

4

3 回答 3

5

这是怎么做到的?

编译器支持。Haskell 语言报告要求(,)至少支持 15 个参数(6.1.4),但 GHC 更进一步并生成更多(上次我们对此进行测试,它可以处理数百甚至数千个) . zip并且必须为最多 7 个元组定义其他元组函数。我不知道 GHC 是否会产生更大的数量。

于 2012-08-10T23:08:31.470 回答
1

我的理解是这(,)不是一个常规函数,它是一个具有特殊语法的构造函数,硬连线到语言中。它类似于 syntax [1, 2, 3],你无法定义自己,因为它是硬连线的。

于 2012-08-12T11:05:57.357 回答
1

它在语言定义中指定并硬连接到编译器中。你没有在 Haskell 中定义元组,Haskell 的定义包括元组。

元组有可接受的 (,,,) 语法,它们是匿名产品类型,非常基础。这些也与类型推断完美配合,因为每个组件都存在并且可以推断。

匿名求和类型没有可接受的语法,它们可能无法很好地用于类型推断。

Haskell 提供用户可定义的中缀语法,但不提供用户可定义的括号(在广泛的准引用可能性之外)。

于 2012-08-12T15:45:33.907 回答