Увы, в кортежах нет магии. Вот реализация, которую GHC использует , и чтобы дать вам некоторое представление о том, что происходит, вот источник для последнего определения:
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__
... да.
Итак, возможно ли определить это семейство операторов / функций из самой реализации haskell, используя только систему типов и существующие языковые функции (объявления, сигнатуры типов, определения функций и т. Д.)?И если да, то как?Или это невозможно, и вместо этого вам нужно заглянуть в компилятор, чтобы найти вспомогательную среду для этого набора функций?
Нет, нет способа определить кортежи подобным образом в общем виде.Общий шаблон является чисто синтаксическим, ничего, что нельзя сделать рекурсивно в системе типов или иным образом.Вы можете сгенерировать такие определения, используя Template Haskell, конечно, но вы все равно будете генерировать каждое из них отдельно с помощью манипуляции со строками для создания имени, без использования какой-либо общей структуры.
Существует также тот факт, что синтаксис кортежавстроенный, а не то, что можно подражать, но это отдельная проблема.Вы можете представить себе такие типы, как:
data Tuple2 a b = Tuple2 a b
data Tuple3 a b c = Tuple3 a b c
... и т. Д., Которые не используют специальный синтаксис, но по-прежнему не могут быть определены в общем по указанным выше причинам.
Это приводит к еще более общему вопросу: какая часть Haskell поддерживается самим Haskell через определения типов и функций, объявления и т. Д .;и сколько поддерживается компилятором / реализацией?(Я знаю, что GHC был написан на Хаскеле, который не отвечает на вопрос)
Почти все это определено в Хаскеле.Некоторые вещи имеют специальный синтаксис, который вы не можете имитировать, но в большинстве случаев он распространяется только на то, что компилятор уделяет особое внимание определенным определениям.В противном случае нет никакой разницы между this :
data [] a = [] | a : [a]
... и любым эквивалентным типом, который вы определяете сами.
То есть, если бы выотказаться от стандартных библиотек (включая прелюдию) и делать все с нуля на простом Хаскеле;Можно ли построить полную реализацию, которая имеет все функции GHC, используя только этот минимальный набор функций?Каков минимальный набор языковых возможностей, которые вам нужны для создания реализации на Haskell с использованием Haskell?Смогу ли я отказаться от прелюдии, а затем полностью перестроить ее вручную из GHC?Если вы откажетесь от прелюдии и никогда ничего не импортируете, что вам остается для работы?
Вам может показаться полезным прочитать о расширениях GHC NoImplicitPrelude и RebindableSyntax , которыеПозвольте вам, среди прочего, изменить определения, используемые для интерпретации записи do
, обработки числовых литералов, синтаксиса if then else
и т. д.
Достаточно сказать, что очень, очень мало можетне будет переопределено.Большинство вещей, которые не могут быть только специальными из-за синтаксиса, и могут быть заменены эквивалентными вещами (например, списки и кортежи, выше).
В конце есть ограниченный набор вещей, которые имеют очень специальное поведение - тип IO
, являющийся очевидным примером - который вы не можете заменить вообще, потому что они подключены непосредственно к чему-то в системе времени выполнения, которое вы не можете заменить.