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字段所指的类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |