我怎样才能删除Haskell(GHC)中的“if ... then ... else ...”关键字?

时间:2011-08-09 12:37:53

标签: haskell ghc leksah

我想删除if ... then ... else ...个关键字,因为我在Haskell中嵌入了一个语言/ DSL。 ifthenelse在许多领域传达了很多意义,如果我能重新定义(或保留它们未定义)它们以反映语言的本质,那将是很好的/域。

我搜索了Google和stackoverflow,但一无所获。 (我确实在Haskell中找到了if ... then ... else ...作为关键字包含的原因。)

我的IDE位于Leksah,如果可以删除关键字,那么设置将if ... then ... else ...关键字更改回正常字体/颜色/解包方式也会很不错。


我已经为if'尝试了if的命名约定,依此类推。它并非感觉一样好,特别是当我想定义ifif'时,必须定义if'if'',或if1if2if'if的存在也可能令人困惑。 (由于DSL的用户是Haskell程序员,在我的情况下,这种混乱并不严重,但我认为它可以在其他情况下提供帮助。)


总结迄今为止的回应:

  • 对GHC使用RebindableSyntax扩展名。不像删除关键字那样通用:保留Haskell的if-then-else的语法。 (Frerich Raabe)
  • 解决方法:使用data Conditional b a = If b (Then a) (Else a)使用非常相似的字/名称(仅适用于某些情况)。 (C. A. McCann)

如果RebindableSyntax是一个相对较新的功能,那么它不太可能找到更通用的方式,至少在下一版GHC之前是这样。

3 个答案:

答案 0 :(得分:30)

GHC的RebindableSyntax扩展名允许您使用自己的版本重载if ... then ... else个表达式。特别是,ifThenElse函数用于定义替代含义。 if e1 then e2 else e3"表示ifThenElse e1 e2 e3

请参阅博客文章Rebindable if..then..else expressions,详细讨论此功能,包括一些示例。

答案 1 :(得分:11)

您无法删除现有关键字。正如所指出的那样,您可以使用RebindableSyntax,但这可能不会达到您想要的效果。

接近删除关键字的唯一方法是打开CPP选项并执行类似

的操作
#define if if_
#define then then_
#define else else_

然后预处理器将if / then / else扩展为if_ / then_ / else _。

答案 2 :(得分:0)

怎么样:

cond True  t _ = t
cond False _ f = f