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

Scalaz的Unapply:为什么不跟踪状态?为什么必须存在遍历?

发布时间:2020-12-16 18:48:28 所属栏目:安全 来源:网络整理
导读:通常 Scalaz的 Unapply 表现相当不错,但它似乎与traverseU打破了: scala import scalaz._,Scalaz._,Unapply._import scalaz._import Scalaz._import Unapply._scala val stateMonadInstance = unapplyMAB2[Monad,State,Int,Unit](IndexedStateT.stateMonad[
通常 Scalaz的 Unapply表现相当不错,但它似乎与traverseU打破了:

scala> import scalaz._,Scalaz._,Unapply._
import scalaz._
import Scalaz._
import Unapply._

scala> val stateMonadInstance = unapplyMAB2[Monad,State,Int,Unit](IndexedStateT.stateMonad[Int]).TC
stateMonadInstance: scalaz.Monad[[X]scalaz.IndexedStateT[[+X]X,X]] = scalaz.StateTInstances1$$anon$1@27c591e1

scala> List(1,2,3).traverseU((i: Int) => stateMonadInstance.pure(i))
<console>:18: error: Unable to unapply type `scalaz.IndexedStateT[[+X]X,Int]` into a type constructor of kind `M[_]` that is classified by the type class `scalaz.Applicative`
1) Check that the type class is defined by compiling `implicitly[scalaz.Applicative[<type constructor>]]`.
2) Review the implicits in object Unapply,which only cover common type 'shapes'
(implicit not found: scalaz.Unapply[scalaz.Applicative,scalaz.IndexedStateT[[+X]X,Int]])
              List(1,3).traverseU((i: Int) => stateMonadInstance.pure(i))
                                     ^

traverseS方法似乎已被创建为此问题的解决方法,无论它是什么:

scala> List(1,3).traverseS((i: Int) => stateMonadInstance.pure(i))
res11: scalaz.State[Int,List[Int]] = scalaz.package$State$$anon$3@2634d0e2

但我正在尝试编写一个关于monad的通用库,所以这不是一个很好的选择.有谁知道这里的确切问题是什么阻止了它的工作,如果有一个解决方法,不需要特殊的套管状态?

解决方法

好的,这有效:

scala> import scalaz._,Unapply._
import scalaz._
import Scalaz._
import Unapply._

scala> val unapply = unapplyMAB2[Monad,Unit](IndexedStateT.stateMonad[Int])
unapply: scalaz.Unapply[scalaz.Monad,scalaz.State[Int,Unit]]{type M[X] = scalaz.State[Int,X]; type A = Unit} = scalaz.Unapply_0$$anon$13@53a6f572

scala> List(1,3).traverseU((i: Int) => unapply.TC.pure(i))
res0: scalaz.IndexedStateT[scalaz.Id.Id,List[Int]] = scalaz.IndexedStateT$$anon$10@737c45ee

事实上,在这种情况下,只有常规的旧遍历工作:

scala> List(1,3).traverse((i: Int) => unapply.TC.pure(i))
res1: unapply.M[List[Int]] = scalaz.IndexedStateT$$anon$10@73c622ec

我想正在发生的事情是我需要在范围内使用Unapply实例才能知道TC字段所指的类型.

(编辑:李大同)

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

    推荐文章
      热点阅读