在Idris中为依赖对实现半群

时间:2016-11-05 16:51:09

标签: idris

我正在尝试在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)
为什么?实现这一目标的最佳方法是什么?

1 个答案:

答案 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)