我的问题与用in this answer编写的简单解释器有关。我已经在链接后面的答案中问过一个与第一位非单声道解释器有关的similar question before。但是有一个第二个单子变量,与这个问题相关。
如何为the monadic interpreter添加IO功能(您需要向下滚动,因为答案包含两个变体,第一个是非单声道的,而第二个单声道的。)?我的意思是简单地添加一条使用putStrLn的语句。我还不太熟悉Haskell,但我猜您可以通过某种方式将IO monad与解释器monad结合使用。有人可以指出我正确的方向吗?
data Stmt
= Var := Exp
| While Exp Stmt
| Seq [Stmt]
| Print Exp -- a print statement
答案 0 :(得分:3)
一种简单的方法是更改Interp
以合并IO
。
newtype Interp a = Interp { runInterp :: Store -> IO (Either String (a, Store)) }
然后,我们只需在Monad
实例中rd
,wr
和run
上添加一些{ {1}}并绑定。例如,这是新的Interp
实例:
return
首先提取Monad
的优点之一是,我们可以进行此类更改而无需修改解释器的主要部分(instance Monad Interp where
return x = Interp $ \r -> return (Right (x, r))
i >>= k =
Interp $ \r -> do
res <- runInterp i r
case res of
Left msg -> return (Left msg)
Right (x, r') -> runInterp (k x) r'
fail msg = Interp $ \_ -> return (Left msg)
和Interp
)。