2012-01-26 35 views
6

有一個煩人的「功能」,導出實例也受到RebindableSyntax擴展名的影響。我想寫的例子:Haskell - 任何方式來關閉`derivation`實例的重新綁定語法?

{-# LANGUAGE RebindableSyntax #-} 
import qualified Prelude 
data Color = Red | Green | Blue | Periwinkle | Fuschia deriving (Prelude.Eq, Prelude.Ord) 

這出現了錯誤「不在範圍內:`ifThenElse'」。

+1

不知道你在做什麼,但它會幫助將定義移動到另一個文件沒有'RebindableSyntax'? –

回答

7

這對我來說似乎是一種錯誤 - deriving子句充滿了內置魔法,所以我懷疑使用回彈語法的派生實例在實踐中會很有用。現在,如果您還可以重新綁定deriving條款本身並使用TH拼接代替...但我離題了。

我懷疑最簡單和最簡單的解決方案是使用不同的模塊。將數據類型定義放入其自己的模塊中,在那裏使用deriving子句以及範圍內的Prelude函數,然後使用可重定義語法在模塊中導入該類型。如果您的模塊需要進一步的模塊化,請注意StandaloneDeriving也存在,並允許您在一個模塊中定義類型(RebindableSyntax處於活動狀態),在另一個模塊(不包括RebindableSyntax)中派生實例,並從實際使用的模塊方式。

+0

是的,獨立派生需要在需要實例的任何定義之前發生,不是嗎?即,如果沒有導入「Eq」實例,則無法寫入'data Color = ...'和某些'foo :: Color - > Color - > Bool','foo c1 c2 = c1 == c2'。 – gatoatigrado