如何使用monadtrans?

时间:2017-09-26 13:08:35

标签: haskell

我有以下类型:

newtype StateT' s m a =
  StateT' { runStateT' :: s -> m (a,s) }

我实现了MonadTrans实例:

instance MonadTrans (StateT' s) where
  lift ma = StateT' $ \s -> do
    a <- ma
    return (a, s) 

我的问题是:

  • 语句return (a, s)将返回哪种类型?一个元组 还是用monad包裹的元组?

  • 如何使用lift函数并强制使用StateT'类型?

1 个答案:

答案 0 :(得分:3)

  

语句return (a, s)将返回哪种类型?用元组包裹的元组或元组?

一个用monad包裹的元组。自return (a, s) :: m (a, s)

以来这是好的runStateT' :: s -> m (a, s)
  

如何使用提升功能和力量来StateT'输入?

你可能不需要这个。如果你使用lift那里有类型签名,它应该可以正常工作。

你可以制作一个带有类型签名的电梯版本,这个版本会引入你提升到StateT' s的事实,但它不会有太多帮助,因为类型推断仍然需要推断{ {1}}。

s