Итак, в Idris вполне допустимо написать следующее.
item : (b : Bool) -> if b then Nat else List Nat
item True = 42
item False = [1,2,3] // cf. https://www.youtube.com/watch?v=AWeT_G04a0A
Без сигнатуры типа это выглядит как динамически типизированный язык. Но, действительно, Идрис зашифрован. Конкретный тип item b
может быть определен только во время выполнения.
Это, конечно, Haskell-программист, говорящий: тип item b
в смысле Идриса задается во время компиляции, это if b then Nat ...
.
Теперь мой вопрос: могу ли я заключить, что в Haskell граница между исполняемой средой и компиляцией выполняется точно между миром значений (False, "foo", 3) и миром типов (Bool, String, Integer), тогда как в Idris граница между исполняемой средой и компилятором проходит через вселенные?
Кроме того, могу ли я предположить, что даже с зависимыми типами в Haskell (используя DataKinds и TypeFamilies, cf. в этой статье) приведенный выше пример невозможно в Haskell, потому что Haskell вопреки Идрису не допускает утечки данных на уровне уровня?