内部如何定义(,)?

Mik*_*cki 7 haskell

重新定义这个功能是微不足道的

(,) :: a -> b -> (a,b)
(,) a b = (a,b)
Run Code Online (Sandbox Code Playgroud)

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

(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a -> b -> c -> ... -> (a,b,c,...)
Run Code Online (Sandbox Code Playgroud)

这是怎么做到的?为什么不对像元组的所有标准函数一样,比如zip?

Hoogle 没有给我任何结果,我也看不出模板Haskell如何做到这一点,所以我认为它必须是编译器内部的一些魔力.但这对我来说似乎非常不好.

Cat*_*lus 6

这是怎么做到的?

编译器支持.哈斯克尔语言报告任务(,)将支持至少达15个参数(6.1.4),但GHC去一点,并生成他们多很多(我们测试过这最后的时光,它可以处理数百甚至数千) .zip必须为最多7个元组定义其他元组函数.我不知道GHC是否会产生更大量的GHC.

  • Typechecker在某些情况下具有指数时间.因为它没有为长元组定义一些类,请参阅ghc-prim的GHC.Tuple的源代码. (2认同)