声明后自动实例派生

Tar*_*sch 13 haskell typeclass

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

这是一个例子:

在Haskell中自动导出是一个实时节省!

module MoneyModule where

data Money = Money Int
  deriving Show
Run Code Online (Sandbox Code Playgroud)

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

module ExternalModule where

instance Read Money where
  read = error "Can't this be done automatically instead?"
Run Code Online (Sandbox Code Playgroud)

但我真的更喜欢它自动派生,我知道如果只有MoneyModule作者自动派生Read实例,ghc可以做到.


我知道:

  • 最好MoneyModule通过使用缺少的实例修补问题来解决实际问题.
  • 孤立实例被认为是不好的.实例声明最好放在模块中,其中定义了类型类或数据类型.

在我的情况下,我无法遵循最佳实践,因为类型类与数据类型无关.我怀疑类型类模块和数据类型模块是否想要保存实例,因此我创建了第三个库,因为在某些应用程序中需要实例声明.

Dan*_*her 19

GHC有StandaloneDeriving扩展,你可以

{-# LANGUAGE StandaloneDeriving #-}
import MoneyModule

deriving instance Read Money
Run Code Online (Sandbox Code Playgroud)

派生许多类的实例.


Tar*_*sch 5

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

...
library
  exposed-modules: ...
  ...
  ghc-options: -fno-warn-orphans
...
Run Code Online (Sandbox Code Playgroud)