在Idris中约束记录类型

时间:2017-07-17 18:46:49

标签: record typeclass idris

我正在尝试在Idris中写一条记录但是它有一个通用参数需要受到接口的约束。对于普通的联合类型,我可以写:

data BSTree : (a : Type) -> Type where
  Empty : Ord a => BSTree a
  Node  : Ord a => BSTree a -> a -> BSTree a

但是我试图弄清楚做同样事情的语法,只是记录。我试过像:

record Point a where
  constructor MkPoint : Eq a => a -> a -> Point a
  x : a
  y : a

但它没有编译。

有没有办法在Idris做到这一点?

TIA

1 个答案:

答案 0 :(得分:2)

你可以这样做:

record Point a where
  constructor MkPoint
  x : Eq a => a
  y : Eq a => a

虽然实际上你不应该这样做。相反,最好使用一些智能构造函数,其他函数如mkPoint : Eq a => a -> a -> MkPoint a。 在现实生活中,您不需要约束数据类型的字段类型。阅读-XDataTypeContexts Haskell扩展。