声明后自动实例派生

时间:2012-10-12 04:37:09

标签: haskell typeclass

在Haskell中,定义数据类型时,您可以选择自动派生 在某些情况下,但我可以推迟自动推导,甚至可以把它放进去 另一个图书馆?

以下是一个例子:

在Haskell中自动派生是一个实时的保护程序!

module MoneyModule where

data Money = Money Int
  deriving Show

现在我希望使用MoneyModule,但我还需要Read的{​​{1}}个实例:

Money

但我真的更喜欢它自动派生,我知道如果只有MoneyModule作者自动派生module ExternalModule where instance Read Money where read = error "Can't this be done automatically instead?" 实例,ghc可以做到。


我知道:

  • 最好通过使用缺少的实例修补问题来解决实际Read中的问题。
  • 拥有孤儿实例被认为是不好的。实例声明 最好放在类型类或数据的模块中 类型已定义。

在我的情况下,我无法遵循最佳实践,因为类型类是无关的 到数据类型。我怀疑类型类模块还是数据类型模块 想要持有实例,因此我正在创建第三个库,因为在某些库中 您需要实例声明的应用程序。

2 个答案:

答案 0 :(得分:19)

GHC拥有StandaloneDeriving扩展名,您可以

{-# LANGUAGE StandaloneDeriving #-}
import MoneyModule

deriving instance Read Money

派生许多类的实例。

答案 1 :(得分:4)

要解决有关独立导出的问题,请参阅daniels解决方案。但正如您在问题中提到的,孤立实例不是最佳实践,而ghc将生成警告。 要压制ghc孤儿警告,您可以使用标记-fno-warn-orphans。您也可以将它添加到您的cabal文件中:

...
library
  exposed-modules: ...
  ...
  ghc-options: -fno-warn-orphans
...