如果我有一个功能f :: State Int()
,是否可以在另一个功能g :: StateT Int IO()
内使用它?将其与f = do { something; g }
嵌套不能与Couldn't match type 'Data.Functor.Identity.Identity' with 'IO'
核对。组合StateT IO与状态
回答
是的,这个操作通常被称为“提升”。只需定义并使用以下功能:
hoistState :: Monad m => State s a -> StateT s m a
hoistState = StateT . (return .) . runState
不幸的是,它没有在Control.Monad.State
模块中定义。
太棒了,谢谢! – Fraser
参见[mmorph'包教程](http://hackage.haskell.org/packages/archive/mmorph/1.0.0/doc/html/Control-Monad-Morph.html#g:4) –
@GabrielGonzalez似乎有一个具有'hoistId ::(Monad m)=> t的monad变换器的类型类,对于基本库来说,标识符a - > tma'是一个有用的(Haskell98)。它只是函子'return的'MFunctor'的专用版本。 runIdentity'。 –
- 1. 在StateT中组合多个状态
- 2. MonadBaseControl IO ... StateT Implementation
- 3. 结合状态IO动作
- 4. 结合StateT与InputT
- 5. 递归与IO和状态单元
- 6. 结合StateT和国家单子
- 7. 状态单声道混合IO和非IO
- 8. 百万秒差距,回溯用户状态与StateT和ParsecT
- 9. 组合状态,FSM
- 10. 组件中的混合状态与redux
- 11. Snap,IO和酸性状态
- 12. StatEt与R 2.15
- 13. 如何在StateT上使用megaparsec的组合器
- 14. 与StateT monad环路
- 15. StateT和WX GUI共存
- 16. 范围管理 - 状态IO Monad?
- 17. Flex 4.5:状态与组件
- 18. StateT and forM_
- 19. 如何使用状态与管道?
- 20. 使StatET与R工作2.15.0
- 21. 使用StateT与ReaderT处理异常IORef
- 22. Monad变压器:IO和状态
- 23. 将天气状态与用户活动状态结合
- 24. StatET和Rmarkdowns
- 25. 如何检索组合框状态
- 26. 迭代组合状态列表模式
- 27. 传入+传出+状态的组合?
- 28. 带状态缩写的组合框
- 29. 组合框单击时丢失状态
- 30. 将React videojs组件的状态与Redux相结合
不应该有'g = do {something; f}'?你想在g中使用f,对吗? – gumik