在Scalaz7中管理导入

And*_*rea 12 scala scalaz scalaz7

我在项目中使用scalaz7,有时我会遇到导入问题.最简单的方法是开始

import scalaz._
import Scalaz._
Run Code Online (Sandbox Code Playgroud)

但有时这会导致冲突.到目前为止我一直在做的事情是下面一个有点痛苦的过程:

  • 找出一个需要与我的实际代码相同导入的最小示例
  • 在单独的项目中复制该示例
  • 使用选项编译它,-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._
Run Code Online (Sandbox Code Playgroud)

等等.

这些子进口是如何组织的?

举个例子,假设我想使用验证.我需要什么,例如注入验证含义并进行以下编译?

3.fail[String]
Run Code Online (Sandbox Code Playgroud)

如何制作ValidationNEL[A, B]一个实例Applicative

rom*_*anb 9

这篇博客文章详细解释了软件包结构并在scalaz7中导入了点菜:http://eed3si9n.com/learning-scalaz-day13

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

import scalaz.syntax.validation._
Run Code Online (Sandbox Code Playgroud)

验证已经有一个方法ap:

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

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

import scalaz.syntax.applicative._
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

"hello".successNel[Int] <*> ((s: String) => "x"+s).successNel[Int]
Run Code Online (Sandbox Code Playgroud)