【问题标题】:Automatic instance deriving after declaration声明后自动派生实例
【发布时间】:2012-10-02 20:56:07
【问题描述】:

在 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 中通过使用缺少的实例进行修补来解决问题。
  • 认为拥有孤儿实例是不好的。实例声明 最好放在类型类或数据所在的模块中 类型已定义。

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

【问题讨论】:

    标签: haskell typeclass


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      为许多类派生实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 2011-04-02
        • 1970-01-01
        • 2019-09-15
        • 2016-07-25
        相关资源
        最近更新 更多