如何将单语翻译带到IO monad?

时间:2019-01-01 10:52:59

标签: haskell interpreter

我的问题与用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

1 个答案:

答案 0 :(得分:3)

一种简单的方法是更改​​Interp以合并IO

newtype Interp a = Interp { runInterp :: Store -> IO (Either String (a, Store)) }

然后,我们只需在Monad实例中rdwrrun上添加一些{ {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 )。