【问题标题】:Statement evaluator trace in HaskellHaskell 中的语句评估器跟踪
【发布时间】:2013-02-06 08:31:00
【问题描述】:

我正在尝试编写一个接受任何通用语句的程序, 评估它,并在评估时显示每个步骤。

例如, 如果我们有一系列赋值语句,它应该运行为:

  • 评估赋值语句 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

有人可以帮忙吗? 提前致谢!

【问题讨论】:

  • 您需要向我们展示StatementStore 的数据定义,然后我们才能为您提供任何有用的帮助。
  • @ChrisTaylor,我尝试通过编辑问题来添加相同的内容。你能帮忙吗?谢谢。
  • 您面临的具体问题是什么?为什么你不能做到这一点?现在,这个问题听起来像是“我的程序没有做的事情。你能帮我完成它吗?”这对 StackOverflow 来说不是一个好问题。你可以说得更详细点吗?你试过什么?
  • 我已经回答了基本相同的问题here;适应您的需求应该不难。

标签: haskell expression-evaluation


【解决方案1】:

如果你只想看痕迹,你可以用traceDebug.Trace来“欺骗”引用透明并输出中间信息。

另一种方法是将WriterT 包裹在您的Maybe 周围,并使用tell 发出中间信息。这实际上会返回一些您可以在 Haskell 中检查的值。

请注意,只有在您的评估成功时才会返回您的跟踪信息。要始终返回跟踪信息,请将 MaybeT 包裹在 Writer 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多