在接口实现中使用类型同义词

时间:2018-04-05 10:46:52

标签: idris

给出两个接口:

interface Poset a (po : a -> a -> Type) where
  reflexive :  (x : a) -> x `po` x

interface JoinSemilattice a where
  join : a -> a -> a
  joinAssociative : (x, y, z : a) -> x `join` (y `join` z) = (x `join` y) `join` z

我希望使用以下类型的同义词给出第二个接口的第一个接口的实现:

LTE : JoinSemilattice a => a -> a -> Type 
LTE x y = (x `join` y = y)

执行以下操作:

implementation JoinSemilattice a => Poset a LTE where
...

然而,idris编译器会出现以下错误:

 LTE  cannot be a parameter of Algebra.Lattice.Poset
 (Implementation arguments must be type or data constructors)

在我看来,编译器无法看到类型同义词实际上是一个类型构造函数。 有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

是的,根据Idris问题#3727,这似乎是对接口实现的蓄意限制。至于解决方法,以下方法不太直接,但它有效:

interface Poset a (po : a -> a -> Type) where
  reflexive : (x : a) -> x `po` x 

interface JoinSemilattice a where 
  join : a -> a -> a
  selfJoin : (x : a) -> x `join` x = x 

data LTE : a -> a -> Type where
  CheckLTE : JoinSemilattice a => {x,y : a} -> x `join` y = y -> LTE x y

implementation JoinSemilattice a => Poset a LTE where
  reflexive x = CheckLTE (selfJoin x)