【发布时间】:2014-03-25 13:28:12
【问题描述】:
我通过将 Haskell 函数转换为 Scala 来学习 Scala。我有一个包含 StateMonad 的单子变压器堆栈
type TI a = ...
使用这个 monad 转换器堆栈的一个函数是:
fresh :: TI Int
fresh = do n <- get
put (n + 1)
return n
由于这个函数只依赖于 State monad,我也可以将类型更改为:
fresh :: (MonadState Int m) => m Int
这如何转化为 Scala?在 Scala 中,我使用组成状态和身份单子的单子转换器堆栈:
type TI[A] = StateT[Id, scala.Int, A]
Scala 中的新函数如下所示:
def fresh:TI[Ty] = for {
counter <- get[scala.Int]
_ <- put[scala.Int] (counter + 1)
} yield {
TyVar(counter)
}
如何在 Scala 中重写类型签名,使其仅依赖于 State monad 而不是整个 monad 转换器堆栈?
【问题讨论】: