重新定义函数
是微不足道的(,) :: a -> b -> (a,b)
(,) a b = (a,b)
奇怪的(对我而言)是这个函数是为任意长度的元组定义的。因此,例如,实际上有一个函数:
(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a -> b -> c -> ... -> (a,b,c,...)
这是怎么做到的?为什么不对元组上的所有标准函数(如zip?
)执行此操作Hoogle给了我no results,我看不出模板Haskell如何做到这一点,所以我认为它必须是编译器内部的某种魔力。但这对我来说似乎非常不合适。
答案 0 :(得分:6)
这是怎么做到的?
编译器支持。 Haskell语言报告要求(,)
至少支持最多15个参数(6.1.4),但GHC更进一步并且生成它们更多(上次我们测试过它,它可以处理数百甚至数千)。必须为最多7个元组定义zip
和其他元组函数。我不知道GHC是否会产生更大量的产品。
答案 1 :(得分:2)
我的理解是(,)
不是常规函数,它是具有特殊语法的构造函数,硬连接到语言中。它与语法[1, 2, 3]
类似,你无法自己定义,因为它是硬连线的。
答案 2 :(得分:2)
它在语言定义中指定并硬连接到编译器中。你没有在Haskell中定义元组,Haskell的定义包括元组。
元组的接受(,,,)语法是匿名产品类型,它们非常基础。这些也与类型推断完美匹配,因为每个组件都存在并且可以推断出来。
匿名和类型没有可接受的语法,它们可能不适合类型推断。
Haskell提供用户可定义的中缀语法,但不提供用户可定义的括号(在广泛的准引用可能性之外)。