1

一般的なステートメントを取り込んで評価し、評価されるたびに各ステップを表示するプログラムを作成しようとしています。

たとえば、一連の割り当てステートメントがある場合、次のように実行する必要があります。

  • 割り当てステートメント 1 の評価

  • 評価結果を表示 1

  • 割り当てステートメント 2 の評価

  • 評価結果の表示 2

現在、最終結果のみを表示しています。コードは

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

> evalS_maybe w@(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

誰でも助けてもらえますか?前もって感謝します!

4

1 に答える 1

1

トレースのみを表示したい場合は、tracefromを使用しDebug.Traceて参照透過性を「チート」し、中間情報を出力できます。

もう 1 つのアプローチは、 をラップしWriterTMaybe、 を使用tellして中間情報を出力することです。これにより、Haskell で検査できる値が実際に返されます。

これにより、評価が成功した場合にのみトレースが返されることに注意してください。常にトレースを返すには、代わりにラップMaybeTWriterます。

于 2013-02-06T15:18:17.947 に答える