下面的deq
函数为Dec
返回一个Name
实例,该实例可以包含一个字符串,或者为Name
加上两个构造函数之一。
data Name : Set where
Str : String -> Name
Cp0 : Name -> Name
Cp1 : Name -> Name
deq : (a : Name) -> (b : Name) -> Dec (a ≡ b)
deq (Str a) (Str b) with iseq a b
deq (Str a) (Str b) | yes p = yes (cong Str p)
deq (Str a) (Str b) | no ¬p = no f
where f : (Str a ≡ Str b) -> ⊥
f refl = ¬p refl
deq (Str a) (Cp0 b) = no (λ ())
deq (Str a) (Cp1 b) = no (λ ())
deq (Cp0 a) (Str b) = no (λ ())
deq (Cp0 a) (Cp0 b) with deq a b
deq (Cp0 a) (Cp0 b) | yes p = yes (cong Cp0 p)
deq (Cp0 a) (Cp0 b) | no ¬p = no f
where f : (Cp0 a ≡ Cp0 b) -> ⊥
f refl = ¬p refl
deq (Cp0 a) (Cp1 b) = no (λ ())
deq (Cp1 a) (Str b) = no (λ ())
deq (Cp1 a) (Cp0 b) = no (λ ())
deq (Cp1 a) (Cp1 b) with deq a b
deq (Cp1 a) (Cp1 b) | yes p = yes (cong Cp1 p)
deq (Cp1 a) (Cp1 b) | no ¬p = no f
where f : (Cp1 a ≡ Cp1 b) -> ⊥
f refl = ¬p refl
但是在这里,一些子句很尴尬,因为它们需要where
。如果标准库具有等效的cong
,可以使我们将a ≡ b -> ⊥
转换为F a ≡ F b -> ⊥
的构造函数F
,那么我们可以简化此定义。另外,如果我们可以使用lambda进行内联模式匹配,我们也可以对其进行改进,但是为此,我们需要使用类型来注释lambda输入。有什么办法可以改善这个定义?