Я искал основной язык haskell, чтобы понять, как это работает. Одна из особенностей, которую я обнаружил во время моего поиска в Интернете, - это принудительные действия типа. Я знаю, что они используются для реализации GADT, но я не понимаю ничего другого. Все описания, которые я нашел в Интернете, были для меня довольно высоким, хотя у меня есть хорошее понимание системы F. Может ли кто-нибудь объяснить тип принуждения понятным образом для меня, пожалуйста?Что такое принуждения типа GHC?
ответ
В основном, Haskell компилируется, оценивая этот простой базовый язык. Стремясь сохранить простоту, обычно не желательно добавлять конструкции, подобные GADT, или вводить классы непосредственно на язык, поэтому вместо этого они компилируются в самом переднем конце компилятора в более простые, но более общие (и подробные) конструкции, предоставляемые ядро. Также имейте в виду, что Core типизирован, поэтому мы должны убедиться, что мы можем кодировать все эти вещи типизированным способом, что является значительным осложнением.
Для кодирования GADT они обрабатываются обычными типами данных с экзистенциальными значениями и принуждениями. Основная идея заключается в том, что принуждение является типом с так называемым видом равенства, написанным t ~ t'
. Этот тип предназначен для свидетельства того, что, хотя мы, возможно, и не знаем этого, t
и t'
- это тот же тип под капотом. Они передаются так же, как и любой другой тип, поэтому нет ничего особенного в том, как это обрабатывается. Существует также набор конструкторов типов для манипулирования этими типами конституций, мало доказательств равенства, например sym :: t ~ t' -> t' ~ t
. Наконец, на уровне термина есть оператор, который принимает термин типа t
и тип вида t ~ t'
и набирается как термин типа t'
. например, cast e T :: t'
, но этот термин ведет себя одинаково с e
. Мы только что использовали наше доказательство, что t'
и t
те же, что и для e
, чтобы сделать проверку типа счастливой.
Это основная идея
- Виды, представляющие равенство
- типы, представляющие доказательства равенства
cast
на срок уровне, чтобы использовать эти доказательства
Также обратите внимание, что путем выделения доказательств в уровень типа, в котором они не могут закончиться, имеют затраты времени исполнения, поскольку типы будут удалены по строке.
Я думаю, что хорошая ссылка на все это System F with Type Equality Coercions, но, конечно, все публикации SPJ могли бы помочь.
@jozefg заслуживает ответа, но вот пример GADTs desugaring для экзистенциальной количественной оценки. Не совсем Core, но шаг к нему.
data Foo :: * -> * where
Bar :: Int -> Foo Int
Oink :: b -> c -> d -> Foo (f b)
с помощью
data Foo a where
Bar :: (a ~ Int) => Int -> Foo a
Oink :: (a ~ f b) => b -> c -> d -> Foo a
к
data Foo a
= (a ~ Int) => Bar Int
| forall b c d f. (a ~ f b) => Oink b c d
Предоставлено /u/MitchellSalad on /r/haskell.
- 1. Что такое `MAIN`? (профилирование ghc)
- 2. Что такое принуждения, такие как Int (Cool)?
- 3. Изменение принуждения типа PHP
- 4. избежать принуждения типа numpy getcha?
- 5. неявного Принуждения типа значения flash.display.SimpleButton
- 6. Декларирование принуждения от типа записи
- 7. Что такое контекст типа?
- 8. Что такое безопасность типа?
- 9. Что такое машинопись типа?
- 10. Что такое 1UI64 типа?
- 11. Что такое код типа?
- 12. Что такое кванторы типа?
- 13. Проблемы с выбором типа GHC
- 14. Что такое boost :: определение типа?
- 15. Что такое система унифицированного типа?
- 16. Что такое уникальный идентификатор типа?
- 17. Что такое подобъект для типа?
- 18. Что такое? означает после типа?
- 19. Что такое принцип полноты типа?
- 20. Что такое данные типа MIME?
- 21. Что такое "Вариант типа (Ошибка)"?
- 22. Что такое синтаксис типов ограничений для GHC 7.4.1?
- 23. Что такое активность IO, которую поддерживает менеджер IH GHC?
- 24. Отключить Javascript Типа принуждения предупреждения в Resharper
- 25. Ошибка принуждения типа в IE8 RegExp.exec()?
- 26. Убедительная GHC, что `Maybe Void` является единицей типа
- 27. неявного принуждения значения типа flash.events:KeyboardEvent несвязанного типа flash.events:MouseEvent
- 28. неявного принуждения значения типа String, несвязанного типа UINT
- 29. Что такое символ Хаскелла?
- 30. Что означает источник GHC от «zonk»?