如何在Haskell(GHC)中移除“if ... then ... else ...”关键字?

16
我想删除 if ... then ... else ... 关键词,因为我正在将一种语言/DSL 嵌入到 Haskell 中。在许多领域中,ifthenelse 表达了很多含义,如果我能重新定义它们(或者将它们保留未定义)以反映语言/领域的本质,那就太好了。
我在谷歌和stackoverflow上搜索过,但没有找到相关信息。(我确实找到了一个旧帖子,解释了为什么在 Haskell 中包含了 if ... then ... else ... 这些关键字。)
我的 IDE 是 Leksah,如果可以删除这些关键字,则还可以设置一个选项来将 if ... then ... else ... 关键字更改回其正常字体/颜色/不加粗状态。
我已经尝试过使用 if' 等类似命名约定来代替 if 等关键字,但感觉不太好,特别是当我想要定义 ifif' 时,必须定义 if'if''if1if2。同时出现 if'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版本之前不会有。


你是否真的想要“删除”语言关键字,以便编译器可以将它们视为变量? - eternalmatt
3
如果您的DSL与周围的Haskell足够不同,并且通过构建代表DSL中表达式的某种数据结构进行工作,那么您也可以只是使用一个数据类型。例如,类似于data Conditional b a = If b (Then a) (Else a) - C. A. McCann
你应该记住,不要设计你的DSL使代码看起来像英语,而是应该设计它们使得很容易看出代码是否无法工作。 - Anonymous
1
Antal: 感谢您的编辑。 Camccann: 好建议。(而且看起来您已经重构了您的 SO 名称。) Eternalmatt: 我同意删除关键字会有一些缺点,必须要好好考虑。然而,即使作为简化语法,Haskell 的 if-then-else 也非常不必要,却使用了主要的短名称。 - Dingfeng Quek
3个回答

31

11

您无法删除现有的关键字。正如其他人指出的那样,您可以使用RebindableSyntax,但这可能不是您想要的。

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

#define if if_
#define then then_
#define else else_
预处理器会将 if/then/else 展开为 if_/then_/else_。

1
这样做是不安全的。正确的方法涉及编写Haskell解析器来重构Haskell代码... - Dingfeng Quek
一般情况下绝对不安全。 - augustss

0

怎么样:

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

1
这真的是误解了重点。当然,我们可以用不同的名称实现与“if ... then ... else ...”相同的行为,但我们真正想要的是在相同的名称下具有不同的行为。 - Daniel Wagner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接