匹配存在的隐藏类型索引
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
我想匹配 '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