我正在使用StateT-monad(與IO組合)和EitherT monad在Haskell中編寫一個小型解釋器。現在我想將整數函數應用於由interpArithmic函數解釋的值。但問題是,interparithmic本身也有EitherT InterpError (StateT Environment IO())
簽名。我如何提取由interpArithmic函數解釋的值,在我的bAritHelper函數中使用它,將它們加在一起(例如)並返回那裏的新值?從Haskell的2個州獲取數據
bArithHelper :: Arithmic -> Arithmic -> (Integer -> Integer -> Integer) -> EitherT InterpError (StateT Environment IO Value)
bArithHelper a b func =
-- Body of this function is completely broken, don't know how to fix this.
do
st1 <- interpArithmic a
st2 <- interpArithmic b
return $ do
env1 <- get st1
env2 <- get st2
return Num
liftM $
-- This function interpretes an arithmic expression and returns it's result.
-- An error message (int the form of Error) is returned in case something goes wrong.
interpArithmic :: Arithmic -> Either InterpError (StateT Environment IO Value)
interpArithmic (ConstInteger a) = return (Num a)
interpArithmic (BinaryArithmicExpression Add a b) = bArithHelper a b (\x -> \y -> x + y)
或者是否有一些其他方式來處理錯誤並將StateT monad與IO結合使用?
PS:我想保留EitherT作爲外部monad變換器,因爲這樣我就不必在do-block中使用某種情況。
你可以添加數據類型Arithmic&Value的定義嗎? InterpError和Environment也不見了,但是這並不重要,因爲你沒有在示例中使用它們 – sinelaw