Еще одно отличие между Идрисом и Агдой состоит в том, что пропозициональное равенство Идриса является гетерогенным, а Агда - однородным.
Другими словами, предполагаемый определение равенства в Идриса будет:
data (=) : {a, b : Type} -> a -> b -> Type where
refl : x = x
а в Agda, это
data _≡_ {l} {A : Set l} (x : A) : A → Set a where
refl : x ≡ x
л в Defintion Агда можно пренебречь, так как он имеет отношение к полиморфизму вселенной, о котором упоминает Эдвин в своем ответе.
Важным отличием является то, что тип равенства в Agda принимает два элемента A в качестве аргументов, тогда как в Idris он может принимать два значения с потенциальными различными типами.
Другими словами, в Идрисе можно утверждать, что две вещи с разными типами равны (даже если это заканчивается тем, что является недоказуемым утверждением), в то время как в Агда это утверждение бессмысленно.
Это имеет важные и широкомасштабные последствия для теории типов, особенно в отношении возможности работы с теорией гомотопического типа. Для этого гетерогенное равенство просто не будет работать, потому что оно требует аксиомы, которая несовместима с HoTT. С другой стороны, можно сформулировать полезные теоремы с гетерогенным равенством, которые не могут быть прямо сформулированы с однородным равенством.
Возможно, самым простым примером является ассоциативность векторной конкатенации. С учетом длиной индексированных списки называемых векторами определены таким образом:
data Vect : Nat -> Type -> Type where
Nil : Vect 0 a
(::) : a -> Vect n a -> Vect (S n) a
и конкатенацией с следующим типом:
(++) : Vect n a -> Vect m a -> Vect (n + m) a
мы могли бы хотеть, чтобы доказать, что:
concatAssoc : (xs : Vect n a) -> (ys : Vect m a) -> (zs : Vect o a) ->
xs ++ (ys ++ zs) = (xs ++ ys) ++ zs
Это утверждение нонсенс под однородное равенство, так как левая часть равенства имеет тип Vect (n + (m + o)) a
, а правая сторона имеет тип Vect ((n + m) + o) a
. Это совершенно разумное утверждение с гетерогенным равенством.
Возможно, вы хотите посмотреть на coq aswel, синтаксис не находится в миллионах миль от haskell, и он имеет простые в использовании классы типов :) –
Для справки: Agda также имеет монадические и аппликативные обозначения в настоящее время. – gallais