唉,元组并没有什么魔力。这是 GHC 使用的实现 http://www.haskell.org/ghc/docs/latest/html/libraries/ghc-prim-0.2.0.0/GHC-Tuple.html,为了让您了解发生的情况,这里是最后一个定义的来源:
data (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o p q r s t u v w x y z a_ b_ c_ d_ e_ f_ g_ h_ i_ j_ k_ l_ m_ n_ o_ p_ q_ r_ s_ t_ u_ v_ w_ x_ y_ z_ a__ b__ c__ d__ e__ f__ g__ h__ i__ j__
= (,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o p q r s t u v w x y z a_ b_ c_ d_ e_ f_ g_ h_ i_ j_ k_ l_ m_ n_ o_ p_ q_ r_ s_ t_ u_ v_ w_ x_ y_ z_ a__ b__ c__ d__ e__ f__ g__ h__ i__ j__
...yeah.
那么,是否有可能从 haskell 实现本身中定义这一系列运算符/函数,只使用类型系统和现有语言功能(声明、类型签名、函数定义等)?如果是这样,怎么办?或者这是不可能的,您必须查看编译器来找到该函数集合的支持框架?
不,没有办法以通用的方式定义这样的元组。常见模式纯粹是语法上的,不能在类型系统或其他系统中递归地完成任何操作。当然,您可以使用 Template Haskell 生成此类定义,但您仍然需要使用字符串操作单独生成每个定义来创建名称,而不是使用任何类型的共享结构。
还有一个问题是元组语法是内置的,无法模仿,但这是一个单独的问题。您可能会想象这样的类型:
data Tuple2 a b = Tuple2 a b
data Tuple3 a b c = Tuple3 a b c
...等等,它们不使用特殊语法,但由于上述原因仍然无法通用定义。
这引出了一个更普遍的问题:Haskell 本身通过类型和函数定义、声明等支持了多少 Haskell;编译器/实现支持多少? (我知道 GHC 是用 Haskell 编写的,但这并不能回答问题)
几乎所有的内容都是在 Haskell 中定义的。某些事物具有您无法模仿的特殊语法,但在大多数情况下,它们只会扩展到编译器特别注意某些定义。否则,两者之间没有区别this http://www.haskell.org/ghc/docs/latest/html/libraries/ghc-prim-0.2.0.0/src/GHC-Types.html:
data [] a = [] | a : [a]
...以及您自己定义的任何等效类型。
也就是说,如果你要放弃标准库(包括前奏)并在原始 Haskell 中从头开始做所有事情;是否有可能仅使用最少的功能集来构建具有 GHC 所有功能的完整实现?为了使用 Haskell 构建 haskell 实现,您需要的最小语言功能集是什么?我是否能够放弃前奏,然后从 GHC 中手动完全重建它?如果你放弃了前奏并且不再导入任何东西,那么你还剩下什么可以处理呢?
阅读有关 GHC 的内容可能会给您带来启发NoImplicitPrelude 和 RebindableSyntax http://www.haskell.org/ghc/docs/latest/html/users_guide/syntax-extns.html#rebindable-syntax扩展,除其他外,它可以让您更改用于解释的定义do
符号,如何处理数字文字,什么if then else
语法确实如此,等等。
我只想说,非常非常少的事情是无法重新实现的。大多数不能的东西只是由于语法而特殊,并且可以用等效的东西替换(例如上面的列表和元组)。
最后,有一组有限的东西very特殊行为——IO
type 是一个明显的例子——你根本无法替换它,因为它们直接挂接到运行时系统中你无法替换的东西上。