寻找一种在haskell中的数据定义中添加保留字的方法

时间:2012-03-01 20:25:04

标签: haskell

正如标题所说我试图在Haskell中为Imperative语言构建一个解释器。我完成了90%,但是,我试图建立If语句,我的问题是,我将如何定义一个新的数据类型,让我们说:

数据x =如果boolExp则exp exp else exp。

我知道我可以用doIf boolExp exp exp重写这个。但我想看看我是否可以使用这些保留的关键字只是为了好玩(也许简洁)。 请注意,boolExp和exp都是用我的语言定义的并且工作正常(我甚至评估它们以获得实际表达式“value”)。

所以底线是,如何按照上面的要求在我的数据定义中添加保留关键字?

3 个答案:

答案 0 :(得分:2)

您可以获得的最接近的是GHC中的RebindableSyntax扩展程序,它将if cond then truePart else falsePart视为您已编写ifThenElse cond truePart falsePart,其范围为ifThenElse

您不能将它用于数据构造函数,但您可以编写如下内容:

{-# LANGUAGE RebindableSyntax #-}

import Prelude

data BoolExp = Foo
  deriving Show

data Exp = If BoolExp Exp Exp | Bar
  deriving Show

ifThenElse :: BoolExp -> Exp -> Exp -> Exp
ifThenElse = If

example = if Foo then Bar else Bar

main = print example

运行此内容会打印If Foo Bar Bar

但是,除非你正在编写某种内部DSL,否则这很有意义,我强烈建议你坚持使用像If cond truePart falsePart这样的常规语法。以这种方式编写它并没有什么好处,只会让人们在阅读代码时感到困惑。

答案 1 :(得分:0)

这是获得所需语法的的一种愚蠢方式:

data If a = If Bool () a () a
if_ = If
then_ = ()
else_ = ()

expr :: If Int
expr = if_ (3 > 4) then_ 0 else_ 1

但是像hammar说的那样,如果你想真正使用关键字ifthenelse,你需要使用RebindableSyntax或其他一些预处理器/宏,否则你将与Haskell语法冲突。

答案 2 :(得分:0)

除了已经给出的建议,您还可以使用Template Haskell的quasiquote功能来创建您想要的任何语法。