Теперь мой вопрос: Могу ли я право сделать вывод, что в Haskell, граница между средой выполнения и compiletime проходит точно между миром значений (False, «Foo», 3) и в мире типов (Bool, String, Integer), тогда как в Идрисе граница между временем выполнения и компилятором проходит через вселенные?
Идрис не компилирует Epic (UPDATE: нет, он больше не компилирует Epis, как Спирмена говорит в комментарии ниже):
Нет семантической проверки, кроме того чтобы увидеть если имена находятся в области --- это предполагается, что язык более высокого уровня будет выполнен typechecking, и в любом случае Epic не должен делать никаких предположений о системе уровня более высокого уровня или любых применяемых вами преобразованиях. Аннотации типа требуются, но они дают только подсказки для компилятора (я могу это изменить).
Таким образом, типы не имеют значения денотационно, то есть значение термина не зависит от его типа. Кроме того, некоторые вещи уровня ценности могут быть стерты, например. в Vect n A
(где Vect
является тип списков с статически известной длины) n
(длина) могут быть стерты, because
Существуют методы, описанные Brady, McBride и McKinna в BMM04 , чтобы удалить индексы из данных структуры, используя тот факт, что функции, работающие на них, либо уже имеют копию соответствующего индекса, либо индекс может быть быстро реконструирован, если это необходимо.
Дело в том, что pi
в Идриса действует для типов почти так же, как forall
в Haskell: они оба параметрический (хотя эти parametricities разные) в этом случае. Компилятор может использовать типы для оптимизации кода, но на обоих языках поток управления не зависит от типов, то есть вы не можете сказать if A == Int then ... else ...
(хотя, если A
находится в канонической форме, то вы знаете, статически ли это Int
или нет, и, следовательно, can напишите A == Int
, но это все равно не влияет на поток управления, потому что все решения выполняются до запуска). Бетонный тип item b
просто не имеет значения во время выполнения.
Однако, как указано в pigworker, оно не обязательно должно быть параметрическим по типам. Так же как и не обязательно быть непараметрическим по значениям. Тип-уровень - уровень значения и параметрический - непараметрический - полностью ортогональные дихотомии. См. this для получения более подробной информации.
Итак, Haskell и Idris отличаются тем, как они обрабатывают вещи уровня ценности во время выполнения/компилируют контент (потому что в Idris вы можете пометить аргумент с .
, чтобы сделать его стираемым), но они обрабатывают типы примерно одинаково.
Отличный вопрос! Я обращу ваше внимание на [эту лекцию] (https://m.youtube.com/watch?v=ad4BVmPni7A) @pigworker в дополнение к его ответу –
Можете ли вы создать тему/тег idris-Universe и использовать это вместо Вселенной, которая предназначена для базы данных MultiValue. – Mike
@Mike «Создание нового тега требует не менее 1500 репутаций ...» Я думаю, подходящим тегом будет «type-universes». –