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

type mismatch between m and (minus m 0)

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

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

    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

这是类型检查器中的错误吗?

如有疑问,请查找卡住的函数的定义:

:def minus returns(除其他事项外,模数一些清理):

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。现在,当然,当两个方程 return 碰巧重合时,结果相同,但 idris 不知道。

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

  • 要么以某种方式在 m 上进行模式匹配并得到 minus 以减少现在其第一个参数的头构造函数已公开
  • 或通过 minus m 0 = m.
  • 的证明重写