2012-10-12 66 views
11

在Haskell中,定義數據類型時可以選擇自動派生 的一些實例,但是我可以推遲自動派生,甚至可以把它放在 的另一個庫中?聲明後自動導出實例

這裏有一個例子:在Haskell

自動推導是一個真正的節省時間!

module MoneyModule where 

data Money = Money Int 
    deriving Show 

現在我想用MoneyModule,但我也想爲Money一個Read實例:

module ExternalModule where 

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

但我真的寧願爲它自動導出,這我知道GHC能如果只有MoneyModule作者自動派生了Read實例,則完成此操作。


我知道:

  • 這是更好地與丟失的情況下修補它來解決實際MoneyModule問題。
  • 有孤兒實例被認爲是不好的。實例聲明 最好放在定義了類型類型或數據類型的模塊中。

在我的情況下,我無法遵循最佳實踐,因爲類型類與數據類型無關 。我懷疑類型模塊和數據類型模塊 想要保存實例,因此我創建了第三個庫,因爲在某些 應用程序中,您需要實例聲明。

回答

14

GHC有StandaloneDeriving延伸,與這一點,你可以

{-# LANGUAGE StandaloneDeriving #-} 
import MoneyModule 

deriving instance Read Money 

獲得實例爲很多類。

4

要解決關於獨立導出的問題,請參閱daniels解決方案。但正如你在你的問題中提到的,孤兒實例不是最佳實踐,ghc會產生警告。 要抑制ghc孤兒警告,您可以使用標記-fno-warn-orphans。您也可以將它添加到您的cabal文件中:

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