6

通常、ScalazUnapplyはかなり良い仕事をしますが、ここでは次のように壊れているようです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,Int,Int,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,Int,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,Int,Int]])
              List(1, 2, 3).traverseU((i: Int) => stateMonadInstance.pure(i))
                                     ^

traverseSメソッドは、それが何であれ、この問題の回避策として作成されたようです:

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

しかし、問題のモナドに関して汎用的なライブラリを作成しようとしているので、あまり適していません。これが機能するのを妨げている正確な問題がここにあることを知っている人はいますStateか?

4

1 に答える 1

2

わかりました、これは機能します:

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

scala> val unapply = unapplyMAB2[Monad, State, Int, 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, 2, 3).traverseU((i: Int) => unapply.TC.pure(i))
res0: scalaz.IndexedStateT[scalaz.Id.Id,Int,Int,List[Int]] = scalaz.IndexedStateT$$anon$10@737c45ee

実際traverse、この場合、通常の古い作品だけが機能します。

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

フィールドがUnapplyどのタイプを参照しているかを知るために、インスタンスをスコープ内に持つ必要があると思います。TC

于 2013-04-27T02:30:44.320 に答える