在Scalaz中组合IO和状态Monad

在Scalaz中组合IO和状态Monad,scala,scalaz,Scala,Scalaz,我正在尝试使用scalaz中的State monad编写一个简单的程序,该程序将根据用户传入的输入修改某些状态。如何做到最好。目前我有: import scalaz._ import Scalaz._ import effect._ import IO._ def acc = for { i <- init _ <- modify{s: Int => 100} v <- readLn _ <- modify{s: Int => v} } yi

我正在尝试使用scalaz中的State monad编写一个简单的程序,该程序将根据用户传入的输入修改某些状态。如何做到最好。目前我有:

import scalaz._
import Scalaz._
import effect._
import IO._

def acc = for {
  i <- init
  _ <- modify{s: Int => 100}
  v <- readLn
  _ <- modify{s: Int => v}
} yield ()
导入scalaz_
进口Scalaz_
进口效应_
导入IO_
def acc=用于{

i您不能直接执行此操作,但monad transformer版本并不太糟糕:

import scalaz._, Scalaz._, effect._, IO._

type IS[S, A] = StateT[IO, S, A]
type ISInt[A] = IS[Int, A]

val ms = MonadState[IS, Int]
import ms._

def acc = for {
  i <- init
  _ <- modify(s => 100)
  v <- readLn.liftIO[ISInt]
  _ <- modify(s => v.toInt)
} yield ()
import scalaz.\uu0,scalaz.\u0,effect.\u0,IO_
类型为[S,A]=StateT[IO,S,A]
类型ISInt[A]=IS[Int,A]
val ms=MonadState[IS,Int]
导入ms_
def acc=用于{
我
import scalaz._, Scalaz._, effect._, IO._

type IS[S, A] = StateT[IO, S, A]
type ISInt[A] = IS[Int, A]

val ms = MonadState[IS, Int]
import ms._

def acc = for {
  i <- init
  _ <- modify(s => 100)
  v <- readLn.liftIO[ISInt]
  _ <- modify(s => v.toInt)
} yield ()