[英]scalaz List[StateT].sequence - could not find implicit value for parameter n: scalaz.Applicative
I'm trying to figure out how to use StateT
to combine two State
state transformers based on a comment on my Scalaz state monad examples answer. 我试图找出如何使用
StateT
两个结合State
基于对我的评论状态变压器Scalaz状态单子的例子回答。
It seems I'm very close but I got an issue when trying to apply sequence
. 我似乎非常接近,但在尝试应用
sequence
时遇到了问题。
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)
}
So I got as far as having a StateT[StateMap, Random, Int]
that I can unwrap with initial random and empty map states: 所以我得到了一个
StateT[StateMap, Random, Int]
,我可以用初始随机和空映射状态解包:
val (freq, sum) = diceAndFreqSum ! new Random(1L) apply Map[Int,Int]()
// freq: Map[Int,Int] = Map(9 -> 1)
// sum: Int = 9
Now I'd like to generate a list of those StateT
and use sequence
so that I can call list.sequence ! new Random(1L) apply Map[Int,Int]()
现在我想生成那些
StateT
的列表并使用sequence
以便我可以调用list.sequence ! new Random(1L) apply Map[Int,Int]()
list.sequence ! new Random(1L) apply Map[Int,Int]()
. list.sequence ! new Random(1L) apply Map[Int,Int]()
。 But when trying this I get: 但是当我尝试这个时,我得到:
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]
^
Any idea? 任何想法? I can use some help for the last stretch - assuming it's possible.
我可以在最后一段时间使用一些帮助 - 假设它是可能的。
Ah looking at the scalaz Monad source , I noticed there was an implicit def StateTMonad
that confirms that StateT[M, A, x]
is a monad for type parameter x. 啊看着scalaz Monad源代码 ,我注意到有一个
implicit def StateTMonad
确认StateT[M, A, x]
是类型参数x的monad。 Also monads are applicatives, which was confirmed by looking at the definition of the Monad
trait and by poking in the REPL: monad也是应用程序,通过查看
Monad
特征的定义并在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
So this gave me the idea of defining an implicit Applicative[StT]
to help the compiler: 所以这给了我一个定义隐式
Applicative[StT]
以帮助编译器的想法:
type StT[x] = StateT[StateMap, Random, x]
implicit val applicativeStT: Applicative[StT] = implicitly[Monad[StT]]
That did the trick: 这就是诀窍:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.