我目前正在編寫一個表達式分析器。我已經完成了詞法和語法分析,現在我正在檢查類型。我有這樣的(簡體版)中的數據structire表達:如何創建一個可以引入新類型的Haskell函數?
data Expr = EBinaryOp String Expr Expr
| EInt Int
| EFloat Float
現在我需要這會將此轉換爲新類型的函數,說TypedExpr
,這也將包含類型信息。現在我的主要問題是,這種類型應該是什麼樣子。我有兩個想法 - 用類型參數:
data TypedExpr t = TEBinaryOp (TBinaryOp a b t) (TExpr a) (TExpr b)
| TEConstant t
addTypes :: (ExprType t) => Expr -> TypedExpr t
或不:
data TypedExpr = TEBinaryOp Type BinaryOp TypedExpr TypedExpr
| TEConstant Type Dynamic
addTypes :: Expr -> TypedExpr
我開始了第一個選項,但我遇到了問題,因爲這種方法假定您知道表達的類型在解析它之前(對我來說,在大多數情況下都是如此,但並非總是如此)。但是,我喜歡它,因爲它允許我使用Haskell的類型系統,並在編譯時檢查大多數錯誤。
可以用第一個選項做到嗎?
你會選擇哪一個?爲什麼?
每個選項我應該期待什麼問題?
哇!有趣的想法。永遠不會想到它:) – mik01aj 2010-12-10 17:02:55
我想我不明白你的解決方案太好 - eInt','eBinaryOp'應該做什麼?我在哪裏把我的'Expr'放在這個模型裏? – mik01aj 2010-12-11 10:42:23