我正在尝试在Idris中为一个简单的依赖对实现Semigroup
接口,但这不会编译:
Semigroup (n ** Vect n f) where
(<+>) (_ ** xs) (_ ** ys) = (_ ** xs ++ ys)
错误
Type mismatch between
ty
and
Nat
但是这个编译:
myPair:Type -> Type
myPair f = (n ** Vect n f)
Semigroup (myPair f) where
(<+>) (_ ** xs) (_ ** ys) = (_ ** xs ++ ys)
为什么?实现这一目标的最佳方法是什么?
答案 0 :(得分:4)
Idris FAQ:
如果您使用以小写字母开头且未应用于任何参数的类型的名称,则Idris会将其视为隐式绑定参数。
解决问题的一种方法是摆脱一些语法糖并明确绑定n
,如下所示:
Semigroup (DPair Nat (\n => Vect n f)) where
(<+>) = (_ ** xs) (_ ** ys) = (_ ** xs ++ ys)
另一种方法是使用大写字母作为向量长度:
Semigroup (N ** Vect N f) where
(<+>) = (_ ** xs) (_ ** ys) = (_ ** xs ++ ys)
在这里,N
没有绑定Semigroup
实现,这允许DPair
语法糖开始并绑定N
就像我们在第一个变种。
对于myPair
示例,它进行编译,因为该示例基本上等同于上面的DPair
示例。如果你只是去除糖,一切都变得清晰:
myPair:Type -> Type
myPair f = DPair Nat (\n => Vect n f)