scalaz List[StateT].sequence - 找不到参数 n 的隐式值:scalaz.Applicative
我试图根据我的 Scalaz 状态 monad 示例 答案。
看来我已经非常接近了,但在尝试应用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)
}
所以我得到了一个 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
现在我想生成这些 StateT 的列表 并使用 sequence
以便我可以调用 list.sequence ! new Random(1L) 应用 Map[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]
^
有什么想法吗?我可以在最后一段时间内使用一些帮助 - 假设这是可能的。
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.
It seems I'm very close but I got an issue when trying to apply 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:
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]()
. 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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
啊看看 scalaz Monad 源,我注意到有一个
隐式 def StateTMonad
这确认了 StateT[M, A, x] 是类型参数 x 的 monad。此外,单子也是应用程序,通过查看Monad
的定义特性并通过插入 REPL:所以这给了我定义一个隐式
Applicative[StT]
来帮助编译器的想法:这成功了:
Ah looking at the scalaz Monad source, I noticed there was an
implicit def StateTMonad
that confirms thatStateT[M, A, x]
is a monad for type parameter x. Also monads are applicatives, which was confirmed by looking at the definition of theMonad
trait and by poking in the REPL:So this gave me the idea of defining an implicit
Applicative[StT]
to help the compiler:That did the trick: