我在项目中使用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
的实例?
答案 0 :(得分: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]