【发布时间】:2013-11-03 14:42:11
【问题描述】:
我目前有两个共享相同类型的 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
...
其中liftVal :: FooRead a -> FooWrite a 是一个函数,它提取FooRead 函数返回的值并将其滚动到FooWrite monad 中。这一切都很好。
但是,我想不出一种方法将上面的getVal 的执行从我的FooWrite monad 滚动到上下文中。通过上述实现,getVal 将在 monad 的空实例中运行。
我可以弄清楚如何使用FooWrite 上下文构造FooRead 实例
lower :: FooWrite a -> FooRead a
基本上我想将我的作者降级为读者,在阅读器中执行代码,然后将其重新提升为作者。
但不知道如何在这个 monad 中实际执行代码?
【问题讨论】:
-
你需要创建monad trnsformer
FooReadT(或FooWriteT)并扩展你的monadFooWrite(或FooRead)
标签: haskell monads state-monad lifting