16

我想删除if ... then ... else ...关键字,因为我在 Haskell 中嵌入了一种语言/DSL。ifthenelse在许多领域传达了很多意义,如果我可以重新定义(或不​​定义)它们以反映语言/领域的性质,那就太好了。

我在 Google 和 stackoverflow 上搜索过,但一无所获。if ... then ... else ...(我确实找到了一个关于为什么在 Haskell 中作为关键字包含的旧线程。)

我的 IDE 在 Leksah 中,如果可以删除关键字,那么设置将if ... then ... else ...关键字更改回其正常字体/颜色/非粗体也是很好的。


我已经尝试过if'forif等的命名约定。感觉不太好,尤其是当我想定义ifand if',并且必须定义if'andif''而不是 or if1and时if2。两者的存在if'if可能令人困惑。(在我的情况下,混淆并不是那么严重的问题,因为 DSL 的用户是 Haskell 程序员,但我认为它在其他情况下会有所帮助)。


总结迄今为止的回应:

  • 使用RebindableSyntaxGHC 的扩展。不像删除关键字那样通用:保留了 Haskell 的 if-then-else 的语法。(弗里希·拉贝)
  • 解决方法:通过使用data Conditional b a = If b (Then a) (Else a)(仅适用于某些情况)使用非常相似的单词/名称。(加州麦肯)

如果RebindableSyntax是一个相对较新的功能,那么它不太可能找到更通用的方法,至少要等到 GHC 的下一个版本。

4

3 回答 3

31

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

请参阅博客文章Rebindable if..then..else 表达式以获得对此功能的精彩讨论,包括一些示例。

于 2011-08-09T12:42:21.480 回答
11

您不能删除现有的关键字。正如所指出的,您可以使用 RebindableSyntax,但这可能不会满足您的要求。

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

#define if if_
#define then then_
#define else else_

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

于 2011-08-09T13:01:16.253 回答
0

怎么样:

cond True  t _ = t
cond False _ f = f
于 2011-08-09T12:51:32.360 回答