匹配存在的隐藏类型索引

Match on existentially hidden type index

我想匹配 'existentially hidden' 类型的索引,以便编写 Eq 实例:

module Test

import Data.Vect

data Meep : Type where
  Moop : {n:Nat} -> Vect n Int -> Meep

Eq Meep where
  (Moop {n1} v1) == (Moop {n2} v2) = False

随后,我想查看 decEq n1 n2 委托给 Eq (Vect n Int) 或 return False.

但上面的方法似乎不起作用:

Type checking .\.\Test.idr
.\.\Test.idr:9:9:
When checking left hand side of Prelude.Interfaces.Test.Meep implementation of Prelude.Interfaces.Eq, method ==:
n1 is not an implicit argument of Test.Moop

Idris 的实际做法是什么?

你可以这样做:

Eq Meep where
  (Moop {n = n1} v1) == (Moop {n = n2} v2) with (decEq n1 n2)
    (Moop {n = n2} v1) == (Moop {n = n2} v2) | (Yes Refl) = v1 == v2
    (Moop {n = n1} v1) == (Moop {n = n2} v2) | (No contra) = False