2012-03-01 39 views
1

正如標題所說,我試圖在Haskell中爲命令式語言構建解釋器。但是,我完成了90%,但是,即時嘗試構建If語句,我的問題是,我將如何定義一個新的數據類型可以說:正在尋找一種方法來在haskell的數據定義中添加保留字

data x = if boolExp then exp else exp。

據我所知,我可以重新寫這個東西像doIf boolExp exp exp。但我想看看我是否可以使用這些保留的關鍵字只是爲了好玩(也許簡潔)。 請注意,boolExp和exp都是用我的語言定義的,並且可以正常工作(我甚至會評估它們以獲得實際的表達式「value」)。

所以底線是,我將如何在上面的需求中添加保留關鍵字在我的數據定義中?

+3

無論如何,構造函數不會被稱爲'if'並且是前綴而不是「misfix」嗎?另外,你打算如何解決這將帶來的固有含糊性? – delnan 2012-03-01 20:28:39

+0

我的問題有一個否定的答案不會使它成爲一個愚蠢的問題在我看來,四處尋找無法找到答案。因此,我的問題,爲什麼downvote? – Martinos 2012-03-01 20:55:26

回答

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這樣的常規語法。用這種方式來寫就沒有真正的好處,只會在閱讀你的代碼時迷惑人們。

0

這裏是一個愚蠢的方式來獲得語法的那種你想:

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

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

但像哈馬爾說,如果你想真正使用的關鍵字ifthen,並else,你」你需要使用RebindableSyntax或其他一些預處理器/宏,否則你會與Haskell語法衝突。

0

除了已經提出的建議,您還可以使用模板Haskell的quasiquote功能來創建任何你想要的語法。

相關問題