我目前有两个共享相同类型的 monad,实现类似于State
monad:
newtype FooRead a = FooRead { runFooRead :: Context -> (a,Context) }
newtype FooWrite a = FooWrite { runFooWrite :: Context -> (a,Context) }
它们之间的区别在于,第一个只允许读取上下文(bind 不会改变它),而第二个也允许编辑上下文。
然后有一些函数使用上下文FooRead
来计算一些值而不改变上下文的状态:
getVal :: FooRead a
getVal = do x <- ...
return x
现在我想从 writer monad 的代码中执行这些读取函数之一:
writeFunc :: FooWrite ()
writeFunc = do x <- liftVal getVal
...
whereliftVal :: FooRead a -> FooWrite a
是一个函数,它提取函数返回的值并将其FooRead
滚动到FooWrite
monad 中。这一切都很好。
但是,我想不出一种方法将getVal
上面的执行从我的FooWrite
monad 滚动到上下文中。通过上面的实现,getVal
将运行在一个空的 monad 实例中。
我可以弄清楚如何FooRead
使用FooWrite
上下文构造一个实例
lower :: FooWrite a -> FooRead a
本质上,我想将我的作者降级为读者,在阅读器中执行代码,然后将其重新提升为作者。
但不是如何在这个 monad 中实际执行代码?