【问题标题】:Constraining a record type in Idris在 Idris 中限制记录类型
【发布时间】:2017-07-17 18:46:49
【问题描述】:

我正在尝试在 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

【问题讨论】:

    标签: record typeclass idris


    【解决方案1】:

    你可以这样做:

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

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

    【讨论】:

    • 谢谢。我知道您不应该直接在字段上添加约束。这就是为什么在我的记录示例中我尝试将约束添加到 MkPoint 数据构造函数(这也是我为联合类型所做的)。我没有办法对 MkPoint 数据构造函数进行约束吗?
    • @RouanvanDalen 不,没有办法直接向构造函数添加约束。而且它没有实际意义,因为对字段进行约束和对constructor 进行约束之间没有语义差异。只是语法上的区别。
    猜你喜欢
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多