2013-09-22 2 views
1

J'ai du code qui utilise la syntaxe applicative et monad. Le code ressemble à ceci:scalaz.syntax.monad._ brokes syntaxe applicative

import scalaz._ 
    import scalaz.syntax.applicative._ 
    import scalaz.syntax.std.boolean._ 
    import scalaz.syntax.traverse._ 
    //import scalaz.syntax.monad._ 

    def getPackage[P](implicit pkg: NpmPackage[P]): ValidationNel[String, P] = { 
    val installPackage = (pkg: String) => install(pkg).??!! 

    lazy val getPackage = pkg.commands.traverseU { 
     (c: String) => (binDir |@| binaryForPackage[P](c)) { 
     (a: File,b:File) => c -> a/pkg.packageName/b.toString 
     } 
    } map (_.toMap) map (pkg.newPackage) 

    hasPackage(pkg.packageName) ? 
     getPackage | 
     (installPackage(pkg.packageName) flatMap (_ => getPackage)) 
    } 

Ce code se compile sans problème, juste au moment où je veux remplacer la méthode flatMap avec la méthode >>= importation scalaz.syntax.monad._ i obtenu l'erreur suivante:

[error] value |@| is not a member of scalaz.ValidationNel[String,sbt.File] 
[error]  (c: String) => (binDir |@| binaryForPackage[P](c)) { 

Je suppose que je Je fais quelque chose de mal dans les importations, mais je ne comprends pas pourquoi l'importation de la syntaxe monad broches l'opérateur |@| et comment laisser les deux syntaxe fonctionnent ensemble, une solution? J'utilise scalaz 7.1.0-M2. J'utilise scalaz 7.1.0-M2.

Répondre

0

syntaxe monad includes syntaxe applicative en étendant ToApplicativeOps, de sorte que vous pouvez supprimer applicative._ importer et laisser simplement monad._ importer. D'autre part, si vous avez besoin d'une fonctionnalité apply applicative et bind, vous pouvez simplement les importer:

import scalaz.syntax.apply._ 
import scalaz.syntax.bind._ 
Questions connexes