12

我在一个项目中使用 scalaz7,有时我会遇到导入问题。最简单的入门方法是

import scalaz._
import Scalaz._

但有时这会导致冲突。到目前为止,我一直在做以下稍微痛苦的过程:

  • 制定一个需要与我的实际代码相同的导入的最小示例
  • 将该示例复制到单独的项目中
  • 使用选项编译它-Xprint:typer以找出代码在隐式解析后的样子
  • 在原始项目中导入所需的隐式。

虽然这可行,但我想简化它。我看到 scalaz7 有更细粒度的导入,但我不完全理解它们是如何组织的。例如,我看到一个可以做

import scalaz.std.option._
import scalaz.std.AllInstances._
import scalaz.std.AllFunctions._
import scalaz.syntax.monad._
import scalaz.syntax.all._
import scalaz.syntax.std.boolean._
import scalaz.syntax.std.all._

等等。

这些子导入是如何组织的?

例如,假设我想使用验证。我需要什么,例如注入验证隐式并进行以下编译?

3.fail[String]

ValidationNEL[A, B]一个实例怎么样Applicative

4

1 回答 1

9

这篇博文详细解释了 scalaz7 中的包结构和导入点菜:http: //eed3si9n.com/learning-scalaz-day13

对于您的具体示例,对于 3.failure[String] 您需要:

import scalaz.syntax.validation._

验证已经有一个方法ap

scala> "hello".successNel[Int] ap ((s: String) => "x"+s).successNel[Int]
res1: scalaz.Validation[scalaz.NonEmptyList[Int],java.lang.String] = Success(xhello)

要获取 <*> 运算符,您需要以下导入:

import scalaz.syntax.applicative._

然后你可以这样做:

"hello".successNel[Int] <*> ((s: String) => "x"+s).successNel[Int]
于 2012-11-13T13:02:49.210 回答