首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在接口实现中使用类型同义词

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

Stack Overflow用户
提问于 2018-04-05 18:46:52
回答 1查看 119关注 0票数 1

给定两个接口:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
LTE : JoinSemilattice a => a -> a -> Type 
LTE x y = (x `join` y = y)

执行以下操作:

代码语言:javascript
复制
implementation JoinSemilattice a => Poset a LTE where
...

然而,idris编译器给出了以下错误:

代码语言:javascript
复制
 LTE  cannot be a parameter of Algebra.Lattice.Poset
 (Implementation arguments must be type or data constructors)

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

EN

回答 1

Stack Overflow用户

发布于 2018-04-06 13:27:30

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

代码语言:javascript
复制
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) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49670472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档