Em Idris, “Eq a” é um tipo e posso fornecer um valor para ele?

Na sequência,example1 é uma sintaxe padrão (conforme documentada), comEq a como uma restrição. Noexample2, Eu especificoEq a diretamente como o tipo de um parâmetro e o compilador o aceita. No entanto, não está claro o que posso especificar como um valor desse tipo. Para um tipo específicoa, por exemploNat, Presumo que faria sentido especificar de alguma forma uma implementação deEq Nat, a implementação padrão ou outra implementação nomeada.

%default total

example1: Eq a => (x : a) -> (y : a) -> Type
example1 {a} x y = ?example1_rhs

example1b: Eq a => (x : a) -> (y : a) -> Type
example1b {a} x y = x == y = True

example2: (a : Type) -> Eq a -> (x : a) -> (y : a) -> Type
example2 a eqa x y = ?example2_rhs

example2b: (a : Type) -> Eq a -> (x : a) -> (y : a) -> Type
example2b a eqa x y = x == y = True

eq_nat : Eq Nat
eq_nat = ?eq_nat_rhs

example_of_example2 : Type
example_of_example2 = example2 Nat eq_nat 3 3

Orifícios resultantes:

- + Main.example1_rhs [P]
 `--                  a : Type
                      x : a
                      y : a
             constraint : Eq a
     --------------------------
      Main.example1_rhs : Type

- + Main.example2_rhs [P]
 `--                  a : Type
                    eqa : Eq a
                      x : a
                      y : a
     -----------,---------------
      Main.example2_rhs : Type

- + Main.eq_nat_rhs [P]
 `-- Eq Nat

Tanto quanto eu posso dizer, eu realmente não posso usarexample2b como uma função, a menos que eu tenha alguma maneira de especificar um valor para o segundo parâmetro do tipoEq a.

Há situações em que seria realmente útil poder aplicar uma restrição de interface ao valor de um parâmetro (em oposição ao tipo de parâmetro), por isso espero que esse seja um recurso válido do Idris.

questionAnswers(1)

yourAnswerToTheQuestion