14

在 Haskell 中,当定义数据类型时,您可以选择自动派生一些实例,但我可以推迟自动派生,甚至可以将其放在另一个库中吗?

这是一个例子:

Haskell 中的自动推导可以节省大量时间!

module MoneyModule where

data Money = Money Int
  deriving Show

现在我希望使用MoneyModule,但我也想要一个Read实例Money

module ExternalModule where

instance Read Money where
  read = error "Can't this be done automatically instead?"

但我真的更希望它自动派生,我知道如果只有 MoneyModule 作者自动派生Read实例,ghc 就可以做到这一点。


我知道:

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

就我而言,我无法遵循最佳实践,因为类型类与数据类型无关。我怀疑类型类模块和数据类型模块想要保存实例,因此我创建了第三个库,因为在某些应用程序中您需要实例声明。

4

2 回答 2

21

GHC 有StandaloneDeriving扩展,有了它,你可以

{-# LANGUAGE StandaloneDeriving #-}
import MoneyModule

deriving instance Read Money

派生许多类的实例。

于 2012-10-12T04:40:16.630 回答
4

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

...
library
  exposed-modules: ...
  ...
  ghc-options: -fno-warn-orphans
...
于 2012-10-12T16:18:36.827 回答