我正在尝试定义Idris类型内部的验证类别,但我的方法没有键入check。
class Cat ob (mor : ob -> ob -> Type) where
comp : {a : ob} -> {b : ob} -> {c : ob} -> mor a b -> mor b c -> mor a c
unit : (a : ob) -> mor a a
l : {a,b : ob} -> {f : mor a b} -> (comp (unit a) f) = f
ob
是对象的类型,mor a b
是从a
到b
的态射类型。
还有正确的单位和关联法则,但我对l
的定义不起作用。它说:
When elaborating type of constructor of Main.Cat:
When elaborating an application of comp:
Can't unify
mor a13 b14 (Type of f)
with
mor b14 c (Expected type)
我发现这令人困惑。 unit a
的类型为mor a a
,f
的类型为mor a b
,为什么comp (unit a) f
的类型为mor a b
?
答案 0 :(得分:4)
只有在我明确给出隐含参数时才有效:
class Cat ob (mor : ob -> ob -> Type) where
comp : {a : ob} -> {b : ob} -> {c : ob} -> mor a b -> mor b c -> mor a c
unit : (a : ob) -> mor a a
l : {a,b : ob} -> {f : mor a b} -> (comp {a=a} {b=a} {c=b} (unit a) f) = f
Edwin Brady在this issue中指出了原因。原因是mor a b
和mor b c
没有任何限制,实际上是同一类型。例如,mor
可以是常量函数。在这种情况下,类型检查器无法仅从a
推断出b
和mor a b
,这会导致出现错误消息。
如果有一个限制mor
是一个内射函数(将来可能对类参数做了),就可以推断a
和b
和不再需要隐含地提供论据。