在Idris中定义类别

时间:2015-05-09 09:06:29

标签: dependent-type idris

我正在尝试定义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是从ab的态射类型。 还有正确的单位和关联法则,但我对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 af的类型为mor a b,为什么comp (unit a) f的类型为mor a b

1 个答案:

答案 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 bmor b c没有任何限制,实际上是同一类型。例如,mor可以是常量函数。在这种情况下,类型检查器无法仅从a推断出bmor a b,这会导致出现错误消息。

如果有一个限制mor是一个内射函数(将来可能对类参数做了),就可以推断ab和不再需要隐含地提供论据。