record - 在 Idris 中限制记录类型

标签 record typeclass idris

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

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

最佳答案

你可以这样做:

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

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

关于record - 在 Idris 中限制记录类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45151508/

相关文章:

mysql - 如何更改mysql中特定字段的所有记录

java - 将从文件中读取的数据放入记录中

haskell - 在 Haskell 中创建许多类似的新类型/类型类实例

haskell - Data.Typeable.cast 到现有类型

haskell - 编译器不会为多态常量值选择类型类

idris - 统一算法推断出过于具体的类型

java - 在Java中将字符串插入字节数组中的某个索引处

qt - QAudioRecorder检测到用户不说话并停止

scala - 来自 Idris -> Scala 的 StringOrInt?

对类型构造函数参数具有接口(interface)约束的 Idris 相关记录