Я очень заинтересован в компиляции модулей Formality-Core в библиотеки Haskell. Хотя я мог бы использовать unsafeCoerce
везде, было бы интереснее, если бы я мог сохранить информацию о типе, позволяя публиковать скомпилированные модули в Cabal и использовать их в других проектах Haskell. Проблема в том, что зависимые типы позволяют использовать программы, запрещенные Haskell. Например, функция foo
ниже:
foo: (b : Bool) -> If(b)(Nat)(Bool)
(b)
b<(b) If(b)(Nat)(Bool)>
| zero;
| false;
Возвращает другой тип в зависимости от ввода. Если ввод false
, он возвращает число zero
. Если на входе true
, возвращается логическое значение false
. Похоже, что подобную функцию нельзя перевести на Haskell. Я считаю, что за последние годы Haskell добился хорошего прогресса в направлении зависимых типов, поэтому мне интересно: есть ли способ написать функции, которые возвращают разные типы на основе входного значения?
b: Bool
к уровню типа, чтобы он был известен во время компиляции, либо, наоборот, подтянуть результирующий тип к уровню значения. - person Fyodor Soikin   schedule 15.04.2020Either
? - person bug_spray   schedule 15.04.2020unsafeCoerce
, если только другой вариант не работает. У нас есть GADT + синглтоны для имитации некоторых зависимых типов. У нас также естьDynamic
, который выполняет проверку типов во время выполнения, если статический подход не работает. Возможно, существуют другие безопасные варианты. - person chi   schedule 15.04.2020Either
позволяет только значению вывода зависеть от входного значения, посколькуLeft 0
иRight False
имеют один и тот же тип, а именноEither Natural Bool
. Речь идет о том, чтобы тип вывода зависел от входного значения. (И даже если бы это было так, тот факт, что это монада, не имеет значения. Вы не должны называть вещи монадами только потому, что они имеют экземплярMonad
, если только вы на самом деле каким-то образом не ссылаетесь на экземпляр или не используете его.) - person Joseph Sible-Reinstate Monica   schedule 15.04.2020