2013-09-22 3 views
1

У меня есть код, который использует либо аппликативный, либо синтаксис монады. Код выглядит следующим образом:scalaz.syntax.monad._ бросает прикладной синтаксис

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)) 
    } 

Этот код компилируется без проблем, только тогда, когда я хочу, чтобы заменить flatMap метод с >>= метод импорта scalaz.syntax.monad._ я получил следующее сообщение об ошибке:

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

Я полагаю, что я «Я делаю что-то не так в импорте, но я не могу понять, зачем импортировать синтаксис монады, обманывает оператора |@| и как разрешить оба синтаксиса работать вместе, любое решение?

Я использую scalaz 7.1.0-M2.

ответ

0

monad синтаксис includes Применительный синтаксис путем расширения ToApplicativeOps, поэтому вы можете удалить applicative._ импорт и просто оставить monad._ импорт. С другой стороны, если вам нужна только аппликативная функциональность apply и bind, вы можете импортировать именно их:

import scalaz.syntax.apply._ 
import scalaz.syntax.bind._ 
Смежные вопросы