2013-04-27 3 views
6

आमतौर पर 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,Int,Int,X]] = [email protected] 

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]] = [email protected] 

लेकिन मैं एक पुस्तकालय लिखने की कोशिश कर रहा हूं जो प्रश्न में मोनैड के संबंध में सामान्य है, इसलिए यह बहुत अच्छा फिट नहीं है। क्या किसी को पता है कि यहां सही समस्या क्या है जो इसे काम करने से रोक रही है, और यदि कोई कामकाज है जिसके लिए State के लिए विशेष-आवरण की आवश्यकता नहीं है?

उत्तर

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} = [email protected] 

scala> List(1, 2, 3).traverseU((i: Int) => unapply.TC.pure(i)) 
res0: scalaz.IndexedStateT[scalaz.Id.Id,Int,Int,List[Int]] = [email protected] 

वास्तव में बस नियमित वर्ष traverse इस मामले में काम करता है:

scala> List(1, 2, 3).traverse((i: Int) => unapply.TC.pure(i)) 
res1: unapply.M[List[Int]] = [email protected] 

मुझे लगता है क्या हो रहा है कि मैं दायरे में Unapply उदाहरण है की जरूरत है यह जानने के लिए कि TC फ़ील्ड किस प्रकार का जिक्र कर रहा है।

संबंधित मुद्दे