6

有一个烦人的“特性”,即派生实例也会受到RebindableSyntax扩展的影响。我想写的例子:

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

这会出现错误“不在范围内:`ifThenElse'”。

4

1 回答 1

7

这对我来说似乎是一个错误——deriving无论如何,该子句都充满了内置的魔力,所以我怀疑使用反弹语法的派生实例在实践中是否有用。现在,如果您也可以重新绑定deriving子句本身并改用 TH 拼接......但我离题了。

我怀疑最简单和最简单的解决方案是使用不同的模块。将数据类型定义放在它自己的模块中,deriving在范围内使用 Prelude 函数的子句,然后使用可重新绑定的语法将类型导入模块中。如果您需要在模块中进一步模块化,请注意它StandaloneDeriving也存在,并且可以让您在一个模块中定义类型(带有RebindableSyntax活动),在另一个模块中派生实例(不带RebindableSyntax),并从实际使用该类型的模块导入两者。

于 2012-01-26T20:43:38.853 回答