我试图定义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中的一个错误吗?
答案 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
。