声明后自动导出实例

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

这里是一个例子:

自动获取Haskell是一个实时的节省!

module MoneyModule where

data Money = Money Int
  deriving Show

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

module ExternalModule where

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

但我真的更喜欢它是自动派生的,我知道如果只有MoneyModule作者自动派生了Read实例,ghc才能完成。


我知道:

  • 最好通过修补缺少的实例来解决实际MoneyModule的问题。
  • 孤儿实例被认为是不好的。 实例声明最好放在定义了类型类或数据类型的模块中。
  • 在我的情况下,我无法遵循最佳实践,因为类的类与数据类型无关。 我怀疑type类模块和数据类型模块是否想要保存实例,因此我创建了第三个库,因为在某些应用程序中需要实例声明。


    GHC有StandaloneDeriving延期延长,你可以

    {-# LANGUAGE StandaloneDeriving #-}
    import MoneyModule
    
    deriving instance Read Money
    

    派生许多类的实例。


    要解决关于独立导出的问题,请参阅daniels解决方案。 但正如你在你的问题中提到的,孤儿实例不是最佳实践,ghc会产生警告。 为了抑制ghc孤儿的警告,你可以使用flag -fno-warn-orphans 。 你也可以将它添加到你的cabal文件中:

    ...
    library
      exposed-modules: ...
      ...
      ghc-options: -fno-warn-orphans
    ...
    
    链接地址: http://www.djcxy.com/p/33165.html

    上一篇: Automatic instance deriving after declaration

    下一篇: CPP extension and multiline literals in Haskell