2013-02-06 71 views
1

我試圖編寫一個程序,它接受任何通用語句, 對其進行評估,並在評估每個步驟時顯示它。Haskell中的語句評估器跟蹤

例如, 如果我們有賦值語句序列,它應該運行:

  • 評估賦值語句1

  • 顯示評價結果1

  • 評估賦值語句2

  • 顯示評估結果2

現在,它只顯示最終結果。 代碼是

> evalS_maybe :: Statement -> Store -> Maybe Store 

> evalS_maybe [email protected](While e s1) s = evalS_maybe (If e 
>             (Sequence s1 (While e s1)) 
>              Skip) 
>            s 
> evalS_maybe Skip s    = Just s 
> evalS_maybe (Sequence s1 s2) s = do 
>         sq <-evalS_maybe s1 s 
>         evalS_maybe s2 sq 
> evalS_maybe (Assign x e) s = do 
>         ag <-evalE_maybe e s 
>         return (Map.insert x ag s) 
> evalS_maybe (If e s1 s2) s  = do 
>          b2 <- evalE_maybe e s 
>          case b2 of 
>           BoolVal True -> evalS_maybe s1 s 
>           BoolVal False -> evalS_maybe s2 s 
>           _    -> return s 

編輯:

使用的數據類型的其餘部分是:

> type Variable = String 

> data Statement = 
>  Assign Variable Expression   
> | If Expression Statement Statement 
> | While Expression Statement   
> | Sequence Statement Statement  
> | Skip         
> deriving (Show) 


> data Expression = 
>  Var Variable       
> | Val Value       
> | Op Bop Expression Expression 
> deriving (Show) 


> data Bop = 
>  Plus  
> | Minus 
> | Times 
> | Divide 
> | Gt  
> | Ge  
> | Lt  
> | Le  
> deriving (Show) 

> data Value = 
>  IntVal Int 
> | BoolVal Bool 
> deriving (Show) 

> type Store = Map Variable Value 

任何人可以請幫助? 在此先感謝!

+1

在給予您任何幫助之前,您需要向我們展示'Statement'和'Store'的數據定義。 –

+0

@ChrisTaylor,我試着通過編輯問題來添加相同的內容。你能幫忙嗎?謝謝。 –

+2

你面臨的具體問題是什麼?你爲什麼不能這樣做?現在,這個問題聽起來像「我的程序沒有做什麼,你能幫我完成嗎?」這對StackOverflow來說不是一個好問題。你可以說得更詳細點嗎?你有什麼嘗試? –

回答

1

如果您只想查看痕跡,則可以使用Debug.Tracetrace來「欺騙」參照透明度和輸出中間信息。

另一種方法是圍繞您的Maybe包裝WriterT,並使用tell發出中間信息。這實際上會回饋你可以在Haskell中檢查的一些值。

請注意,只有在您的評估成功後,這纔會回饋您的跟蹤。至總是給回一個跟蹤,你改爲MaybeT而不是Writer