m和(减去m 0)之间的类型不匹配

时间:2017-10-25 21:18:10

标签: idris

我试图定义n-ary函数的依赖类型(由二元和一元函数构建为树;我怀疑它与(Vect n a) -> a的类型同构)作为练习学习伊德里斯。

在尝试定义一个将参数应用于n元函数(生成(n-1)-ary函数)的函数时,我遇到了一个非常可疑的错误:

    Type mismatch between
            ArityFn m a (Type of ng)
    and
            ArityFn (minus m 0) a (Expected type)

    Specifically:
            Type mismatch between
                    m
            and
                    minus m 0

这里有相关代码,仅供参考

data ArityFn : Nat -> (ty: Type) -> Type where
  Val       : (x : ty) -> ArityFn 0 ty
  UnaryFn   : (ty -> ty) -> ArityFn 1 ty
  BinaryFn  : (ty -> ty -> ty) -> ArityFn 2 ty
  NAryFn    : (ty -> ty -> ty) -> (ArityFn n ty) -> (ArityFn m ty) -> ArityFn (n + m) ty

%name ArityFn nf, ng, nh

applyArityFn : a -> (ArityFn n a) -> (LTE 1 n) -> ArityFn (n - 1) a
 ... (some definitions elided)
applyArityFn x (NAryFn h (UnaryFn f)  ng) _ = mkNAryFn h (Val (f x))     ng

这是typechecker中的一个错误吗?

1 个答案:

答案 0 :(得分:3)

如有疑问,请查看卡住的功能定义:

:def minus返回(除其他外,模拟一些清理):

Original definiton:
minus 0 right = 0
minus left 0 = left
minus (S left) (S right) = minus left right

您可以看到minus left 0 = left无法定义,因为之前存在模式minus 0 right = 0。现在,当然两个方程式碰巧重合时会返回相同的结果,但是idris并不知道。

要获得您想要的结果,您可以:

  • 以某种方式在m上进行模式匹配并获得minus以减少其第一个参数的头部构造函数被暴露
  • 或通过minus m 0 = m
  • 的证明重写