1

我有一些使用应用程序和单子语法的代码。代码如下所示:

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

我想我在导入时做错了,但我不明白为什么导入 monad 语法会破坏|@|运算符以及如何让两种语法一起工作,有什么解决方案吗?

我正在使用 scalaz 7.1.0-M2。

4

1 回答 1

0

monad 语法通过扩展 ToApplicativeOps包含applicative._应用语法,因此您可以删除导入并离开monad._导入。另一方面,如果您只需要应用程序apply功能bind,您可以只导入它们:

import scalaz.syntax.apply._
import scalaz.syntax.bind._
于 2013-09-22T21:30:26.533 回答