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
. 的证明重写
我正在尝试定义 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
. 的证明重写