【问题标题】:Combining StateT IO with State将 StateT IO 与 State 结合
【发布时间】:2013-06-26 16:23:47
【问题描述】:

如果我有一个函数f :: State Int (),是否可以在另一个函数g :: StateT Int IO () 中使用它?用f = do { something; g } 嵌套它无法用Couldn't match type 'Data.Functor.Identity.Identity' with 'IO' 进行类型检查。

【问题讨论】:

  • 不应该有g = do { something; f }吗?你想在 g 中使用 f,对吧?

标签: haskell


【解决方案1】:

是的,此操作通常称为“吊装”。对于 State monad,它可以定义为

hoistState :: Monad m => State s a -> StateT s m a
hoistState = state . runState

很遗憾,它没有在Control.Monad.State 模块中定义。

【讨论】:

  • @GabrielGonzalez 似乎有一个带有hoistId :: (Monad m) => t Identity a -> t m a 的monad 转换器的类型类将是对基本库的有用(Haskell98)补充。对于函子return . runIdentity,它只是MFunctor 的一个特殊版本。
  • @Roman Cheplyaka - 这在 Ralf Laemmel 和 Joost Visser 的“函数式战略编程的设计模式”中也称为“局部效应”arxiv.org/abs/cs/0204015
  • 你也可以写成hoistState = state . runState,这样比较不费脑子(事实上StateT . (return .)state的定义)
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2017-09-12
相关资源
最近更新 更多