内部如何定义(,)?

时间:2012-08-10 21:32:02

标签: haskell

重新定义函数

是微不足道的
(,) :: a -> b -> (a,b)
(,) a b = (a,b)

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

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

这是怎么做到的?为什么不对元组上的所有标准函数(如zip?

)执行此操作

Hoogle给了我no results,我看不出模板Haskell如何做到这一点,所以我认为它必须是编译器内部的某种魔力。但这对我来说似乎非常不合适。

3 个答案:

答案 0 :(得分:6)

  

这是怎么做到的?

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

匿名和类型没有可接受的语法,它们可能不适合类型推断。

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