2012-01-26 12 views
6

派生インスタンスにもRebindableSyntax拡張機能の影響を受ける厄介な「機能」があります。私が書きたいものの例:Haskell - `deriving`インスタンスの場合に再バインド可能な構文を無効にする方法はありますか?

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

これは、「スコープ内ではない: `ifThenElse '」というエラーが発生します。

+1

あなたは何をしようとしているのか分かりませんが、 'RebindableSyntax'がなければその定義を別のファイルに移動するのに役立ちますか? –

答えて

7

私には間違いのようです - deriving句は、とにかく組み込みの魔法でいっぱいです。したがって、リバウンド構文を使用して派生したインスタンスが実際に役立つだろうと懐疑的です。さて、あなたはderivingの節自体をに再バインドして、代わりにTHスプライスを使うことができたら...でも、私は逃げます。

私は、最も簡単で簡単な解決策は、別のモジュールを使用することだと思っています。データ型定義を独自のモジュールに入れ、スコープ内のPrelude関数と共にderiving節を使用し、次にリバインド構文を使用してモジュールで型をインポートします。あなたのモジュールでさらにモジュール性が必要な場合は、StandaloneDerivingも存在し、1つのモジュール(RebindableSyntaxがアクティブ)でタイプを定義し、別のモジュール(RebindableSyntaxなし)でインスタンスを派生させ、実際に使用するモジュールタイプ。

+0

はい、インスタンスを必要とする定義の前にスタンドアロンの派生が必要でしょうか?つまり、 'Eq'インスタンスがまだインポートされていない場合、' data Color = ... 'と' foo :: Color-> Color-> Bool'、 'foo c1 c2 = c1 == c2'と書くことはできません。 – gatoatigrado

関連する問題