【发布时间】:2016-06-05 10:45:50
【问题描述】:
在 ReaderT StateT IO do 块内我尝试使用 <*> 使用 Maybe 参数调用 Maybe 内的函数,但这会导致类型错误。
onMessage <*> (message update)
如果我使用 return $ onMessage <*> (message update) 包装表达式,它会进行类型检查,但函数似乎没有被计算。
如果我解开函数和参数并手动检查Nothing,则调用该函数,但这看起来很难看。
在这种情况下还有其他运算符可以使用吗?这些是我的第一个 Monad Transformer 步骤,这些类型太令人困惑,甚至无法尝试和胡扯一个答案。
...
type Bot a = ReaderT (BotConfig a) (StateT (BotState a) IO)
...
processUpdate :: Update -> Bot a ()
processUpdate update = do
BotConfig {tw_handlers = MessageHandlers {
tw_onMessage = onMg
}
} <- ask
onMg <*> (message update) -- this is what I would like to do
-- onMg :: Maybe (Message -> Bot a ())
-- message :: Update -> Maybe Message
【问题讨论】:
-
你能提供一个带有实际类型的小代码sn-p吗?这很难理解。
-
嗨志。请看上面的代码。
-
也许用 return 包装它是可以的。然后的问题是如何强制评估我尝试了 seq,但没有帮助,而 seqdeep 再次导致类型错误。
标签: haskell monad-transformers