我怎样才能删除“删除”;如果。。。然后。。。否则……”;Haskell中的关键词(GHC)?

我怎样才能删除“删除”;如果。。。然后。。。否则……”;Haskell中的关键词(GHC)?,haskell,ghc,leksah,Haskell,Ghc,Leksah,如果。。。然后。。。else…关键字,因为我在Haskell中嵌入了一种语言/DSL如果,那么和其他在许多领域都传达了很多意义,如果我能重新定义(或不定义)它们以反映语言/领域的性质,那就太好了 我在谷歌和stackoverflow上搜索过,但什么也没找到。(我确实找到了一个关于Haskell中为什么if…then…else…被列为关键字的老帖子。) 我的IDE在Leksah中,如果关键字可以被删除,那么如果有一个设置来更改,如果。。。然后。。。否则…关键字将恢复为正常字体/颜色/未绑定 我已

如果。。。然后。。。else…关键字,因为我在Haskell中嵌入了一种语言/DSL<代码>如果,
那么
其他
在许多领域都传达了很多意义,如果我能重新定义(或不定义)它们以反映语言/领域的性质,那就太好了

我在谷歌和stackoverflow上搜索过,但什么也没找到。(我确实找到了一个关于Haskell中为什么
if…then…else…
被列为关键字的老帖子。)

我的IDE在Leksah中,如果关键字可以被删除,那么如果有一个设置来更改
,如果。。。然后。。。否则…
关键字将恢复为正常字体/颜色/未绑定


我已经为
if
等尝试了
if'
的命名约定。感觉不太好,尤其是当我想定义
if
if'
,而必须定义
if'
if'
,或者
if1
if2
时。同时出现
if'
if
也可能令人困惑。(在我的情况下,这种混淆并不是一个严重的问题,因为DSL的用户都是Haskell程序员,但我想它在其他情况下也会有所帮助)


总结迄今为止的答复:

  • 使用GHC的
    重新绑定语法扩展名。不像删除关键字那样通用:保留Haskell的if-then-else语法。(弗里希·拉贝)
  • 解决方法:使用非常相似的单词/名称,方法是使用
    数据条件b a=If b(Then a)(Else a)
    (仅适用于某些上下文)。(C.A.麦肯)
如果重新绑定语法是一个相对较新的功能,那么就不太可能找到更通用的方法,至少在GHC的下一个版本之前是这样。

如果。。。然后。。。else
表达式使用您自己的版本。特别是,
ifThenElse
函数用于定义替代含义<代码>如果e1,则e2 else e3“表示
ifThenElse e1 e2 e3

有关此功能的详细讨论,请参阅博客文章,包括一些示例。

如何:

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

您不能删除现有的关键字。正如前面指出的,您可以使用RebindableSyntax,但这可能不是您想要的

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

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

然后,预处理器将if/then/else扩展为if/then/else。

是否确实要删除语言的关键字,以便编译器将其视为变量?如果您的DSL与周围的Haskell完全不同,并且通过构建某种数据结构来表示DSL中的表达式,您也可以使用一种数据类型。例如,类似于
data Conditional b a=If b(Then a)(Else a)
。你应该记住,你的DSL的设计不应该让代码看起来像英语,你应该让代码看起来像英语,你应该让代码很容易看出来是否工作。Antal:谢谢你的编辑。;camccann:好的建议。(看起来你已经重构了你的名字。);eternalmatt:我同意在删除关键字时会有一些缺点,必须加以适当考虑。然而,Haskell的if-then-else即使像sugar一样也不必要,但它们使用了素数短名称。这真的没有抓住要点。当然,我们可以实现与“if…then…else…”相同的行为。。。“使用不同的名称,但我们真正想要的是使用相同名称的不同行为。天真地这样做是不安全的。正确地这样做需要编写Haskell解析器来重构Haskell代码……总体上肯定是不安全的。