【问题标题】:Haskell -- any way to turn off rebindable syntax for the case of `deriving` instances?Haskell——有什么方法可以在“派生”实例的情况下关闭可重新绑定的语法?
【发布时间】:2012-01-27 04:43:38
【问题描述】:

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

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

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

【问题讨论】:

  • 不确定您要做什么,但将定义移动到另一个文件中没有RebindableSyntax 会有所帮助吗?

标签: haskell syntax typeclass deriving


【解决方案1】:

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

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

【讨论】:

  • 是的,独立派生需要在任何需要实例的定义之前发生,不是吗?即你不能写data Color = ...和一些foo :: Color -> Color -> Boolfoo c1 c2 = c1 == c2如果还没有Eq实例导入。
猜你喜欢
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多