加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读