【发布时间】:2013-08-21 18:14:47
【问题描述】:
我无能为力来扩展这个问题。但这里有一个用例:假设你有两个 monad 转换器,t 和 s,在同一个 monad m 上进行转换:
master :: (MonadTrans t, Monad m) => t m a b
slave :: (MonadTrans t, Monad m) => s m a b
我想编写master 和slave,这样当m 原语被提升为t 和s 时,它们可以相互通信。签名可能是:
bound :: (MonadTrans t, MonadTrans s, Monad m, Monoid a) => t m a b -> s m a b -> (...)
But what is the type of (...) ?
一个用例,用糖化符号表示:
master :: Monoid a => a -> t m a b
master a = do
a <- lift . send $ (a,False) -- * here master is passing function param to slave
... -- * do some logic with a
b <- lift . send $ (mempty,True) -- * master terminates slave, and get back result
slave :: Monoid a => (a -> b) -> s m a b
slave g = do
(a,end) <- lift receive
case end of
True -> get >>= \b -> exit b
_ -> (modify (++[g a])) >> slave g
更新:send 和 receive 是 m 类型的原语。
如果这个例子看起来做作,或者太像协程,我深表歉意,问题的精神与它无关,所以请忽略所有相似之处。但要点是 monads t 和 s 以前不能合理地相互组合,但是在它们都包装了一些底层 monad m 之后,它们现在可以组合并作为单个函数运行。至于组合函数的类型,我真的不确定,所以有些方向是值得赞赏的。现在,如果这个抽象已经存在而我只是不知道,那最好。
【问题讨论】:
-
s和t是任意的还是它们是特定的 - 我们是否试图创建这样的s和t?同样的问题也适用于m- 它及其send和receive怎么样? -
是的
s和t是任意的。m是我们在这里尝试创建的特定类型。send和receive分别只是(a,Bool) -> m a b和m a b类型的原始函数。但它们是我给出的人为用例的附带条件,它们的实现细节并不重要。
标签: haskell monads monad-transformers