scalaz List [StateT] .sequence – 找不到参数n的隐式值:scala
发布时间:2020-12-16 09:17:02 所属栏目:安全 来源:网络整理
导读:我试图找出如何使用StateT结合两个状态变压器基于我的 Scalaz state monad examples答案的评论. 看来我很亲近,但是当试图应用序列时,我遇到了一个问题. import scalaz._import Scalaz._import java.util.Randomval die = state[Random,Int](r = (r,r.nextInt
我试图找出如何使用StateT结合两个状态变压器基于我的
Scalaz state monad examples答案的评论.
看来我很亲近,但是当试图应用序列时,我遇到了一个问题. 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,x] val diceAndFreqSum = stateT[StateMap,Random,Int]{ random => val (newRandom,dice) = twoDice apply random for (sum <- freqSum(dice)) yield (newRandom,sum) } 所以我得到了一个StateT [StateMap,我可以用初始的随机和空的地图状态来展开: val (freq,sum) = diceAndFreqSum ! new Random(1L) apply Map[Int,Int]() // freq: Map[Int,Int] = Map(9 -> 1) // sum: Int = 9 现在我想生成一些这些StateT并使用序列,以便我可以调用list.sequence! new Random(1L)apply Map [Int,Int]().但是当我尝试这个时,我得到: type StT[x] = StateT[StateMap,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] ^ 任何想法?我可以使用一些帮助,最后一段 – 假设是可能的. 解决方法
啊看着
scalaz Monad source,我注意到有一个隐含的def StateTMonad证实StateT [M,A,x]是一个类型参数x的monad.还有单子是适用的,这是通过查看
the definition of the
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 所以这给了我定义一个隐式的应用[StT]来帮助编译器的想法: type StT[x] = StateT[StateMap,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,10,4,7) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- rails kaminari bootstrap-kaminari-views certified
- angularjs – 如何在多个控制器中重用一个函数
- Mule学习笔记(四)
- Bootstrap学习总结笔记(19)-- 基本插件之Popover提示框
- bootstrap笔记备忘
- Bootstrap Table列宽拖动的方法
- AngularJS将$resource作为指令参数传递
- bootstrap――free bootstrap admin dashboard templates
- angular – 如何双向绑定我自己的RxJS主题为[(ngModel)]?
- bash – 如何在执行shell脚本时避免使用./