【问题标题】:Haskell - Deriving automatically Integral from an enumation of type constructorsHaskell - 从类型构造函数的枚举中自动派生积分
【发布时间】:2015-12-30 04:23:22
【问题描述】:

我想知道是否有办法让 GHC 自动从表单的数据类型派生积分实例:

data = A | B | C | D

所以fromIntegral A = 0,fromIntegral B = 1,等等?

使用

data MyType = A | B | C | D deriving (Show, Eq, Ord, Enum, Real, Integral)

产生错误

无法创建“Integral MyType”的派生实例: “积分”不是可派生类

在“MyType”的数据声明中

(即使使用扩展 GeneralizedNewtypeDeriving)

【问题讨论】:

  • 看看here
  • 是的,我有。它说没有从任何类型派生的通用解决方案,并且在 newType 的情况下,您可以使用 GeneralizedNewtypeDeriving 扩展。但它并不是说 GHC 中没有允许自动派生 A|B|C 形式的类型的扩展。
  • 新类型包装器方法有什么问题?
  • 可以fromEnum :: Enum a => a -> Int 解决您的问题

标签: haskell types


【解决方案1】:

如果您只需要f A == 0f B == 1 等函数,则可以使用fromEnum :: Enum a => a -> Int

Integral 类型类适用于您实际上可以加、减、除的类型...在您的情况下,这些东西没有一个非常明智的实现。如果您想将它们实现为算术模 1 + fromEnum maxBound... 好吧,如果您的 Enum 代表任何这些数字,我不建议这样做,如果他们这样做,@ 987654322@ 包已经实现了你所需要的。

【讨论】:

  • 要加上这个,你可以派生Enum
  • 谢谢,fromEnum :: a -> Int 和 toEnum :: Int -> a 正是我需要的 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2019-03-10
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多