在一個非常簡單的道理,我有類似如下:一個AST的表達式quasiquoter,其中一個構造函數產生一次性計算?
type Runtime a = {- More or less a StateT on top of an Either monad -}
-- The list of strings in Fn is a bunch of parameter names, the values of
-- which are pushed into the state of the runtime before executing the actual
-- function expr
data Expr = Num Int
| Str T.Text
| Fn [T.Text] (Runtime Expr)
| {- Bunch of other constructors -}
eval :: Expr -> Runtime Expr
parseExp :: Parser Expr
現在,我從來沒有用過的模板哈斯克爾任何東西之前,我決定還是想方便的準報價者爲我的玩具語言,所以我承認我可能會錯過某些明顯的東西。
但無論如何,我開始擺弄一下它,跟着一些教程等,基本上發現除了如何處理Fn
構造函數之外,其他所有東西都很容易。
在網絡上我的信息foragings,我發現了兩個普通的方式讓人們寫下了表達報價者:
- 使他們
Expr
數據類型TH的實例:■Lift
和簡單[|報價|]認爲解析導致 - 推導
Data
和Typeable
他們相當於Expr
,然後在相同的解析器結果
在這兩種情況下均適用dataToExpQ
表達,我遇到了與Runtime Expr
併發症。對於第一種情況,問題是,我無法弄清楚如何實現:
instance Lift Expr where
lift (Fn ps e) = [| Fn ps ...? |]
(我沒有管理實施Data.Text實例我自己雖然)。
我想real的問題是我根本不知道TH還不夠好,但迄今爲止沒有足夠的教程或exmaples幫助我得到這個地方的任何地方。
在第二種情況下,這個問題是,對Expr
是的Data
一個實例,也需要有一個
instance Data (StateT (...) (Either ...) Expr) where
-- Something
我的問題則是,是否有一個簡單的方法來做到這一點?或者我應該重新思考我的玩具語言的功能是如何工作的?
如果是後者,有關如何獲得等效功能而不在monad中運行它們的任何建議?畢竟,這似乎是直觀的解決方案,因爲該語言的運行環境需要狀態和錯誤處理(這是我使用的Either
)。
請您詳細說明您遇到的問題。 – dave4420 2012-07-20 09:25:55
試圖澄清一點點的併發症。問題是,我幾乎不知道哪裏可以從任何一個實現開始,所以我不能詳細說明更多 - 這是迄今爲止我得到了多少。 – Kben 2012-07-20 09:50:25