scalaz列表[StateT]。序列-找不到参数n的隐式值:scalaz.Applicative
我试图根据对我答案的评论,找出如何使用scalaz列表[StateT]。序列-找不到参数n的隐式值:scalaz.Applicative,scala,scalaz,monad-transformers,state-monad,Scala,Scalaz,Monad Transformers,State Monad,我试图根据对我答案的评论,找出如何使用StateT组合两个State状态转换器 看起来我很接近,但我在尝试应用序列时遇到了一个问题 import scalaz._ import Scalaz._ import java.util.Random val die = state[Random, Int](r => (r, r.nextInt(6) + 1)) val twoDice = for (d1 <- die; d2 <- die) yield (d1, d2) def
StateT
组合两个State
状态转换器
看起来我很接近,但我在尝试应用序列时遇到了一个问题
import scalaz._
import Scalaz._
import java.util.Random
val die = state[Random, Int](r => (r, r.nextInt(6) + 1))
val twoDice = for (d1 <- die; d2 <- die) yield (d1, d2)
def freqSum(dice: (Int, Int)) = state[Map[Int,Int], Int]{ freq =>
val s = dice._1 + dice._2
val tuple = s -> (freq.getOrElse(s, 0) + 1)
(freq + tuple, s)
}
type StateMap[x] = State[Map[Int,Int], x]
val diceAndFreqSum = stateT[StateMap, Random, Int]{ random =>
val (newRandom, dice) = twoDice apply random
for (sum <- freqSum(dice)) yield (newRandom, sum)
}
现在,我想生成那些StateT
的列表,并使用sequence
,以便调用list.sequence!新的随机(1L)应用映射[Int,Int]()
。但当我尝试这一点时,我得到:
type StT[x] = StateT[StateMap, Random, x]
val data: List[StT[Int]] = List.fill(10)(diceAndFreqSum)
data.sequence[StT, Int]
//error: could not find implicit value for parameter n: scalaz.Applicative[StT]
data.sequence[StT, Int]
^
有什么想法吗?我可以在最后一段中使用一些帮助—假设可能的话。啊,看一下,我注意到有一个隐式def StateTMonad
确认StateT[M,A,x]
是类型参数x的monad。单子也是应用程序,通过查看trait和插入REPL确认:
scala> implicitly[Monad[StT] <:< Applicative[StT]]
res1: <:<[scalaz.Monad[StT],scalaz.Applicative[StT]] = <function1>
scala> implicitly[Monad[StT]]
res2: scalaz.Monad[StT] = scalaz.MonadLow$$anon$1@1cce278
这就成功了:
val data: List[StT[Int]] = List.fill(10)(diceAndFreqSum)
val (frequencies, sums) =
data.sequence[StT, Int] ! new Random(1L) apply Map[Int,Int]()
// frequencies: Map[Int,Int] = Map(10 -> 1, 6 -> 3, 9 -> 1, 7 -> 1, 8 -> 2, 4 -> 2)
// sums: List[Int] = List(9, 6, 8, 8, 10, 4, 6, 6, 4, 7)
我只是不明白你为什么不使用Scala的Random。@DanielC.Sobral,Scala有一个Random类?!哦,是的,那也行。这与我的问题无关,所以我将离开java.util.Random
。
type StT[x] = StateT[StateMap, Random, x]
implicit val applicativeStT: Applicative[StT] = implicitly[Monad[StT]]
val data: List[StT[Int]] = List.fill(10)(diceAndFreqSum)
val (frequencies, sums) =
data.sequence[StT, Int] ! new Random(1L) apply Map[Int,Int]()
// frequencies: Map[Int,Int] = Map(10 -> 1, 6 -> 3, 9 -> 1, 7 -> 1, 8 -> 2, 4 -> 2)
// sums: List[Int] = List(9, 6, 8, 8, 10, 4, 6, 6, 4, 7)