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