Подтвердить что ты не робот

Управление импортом в Scalaz7

Я использую 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?

4b9b3361

Ответ 1

В этом сообщении в блоге подробно описывается структура пакета и импортируется a la carte в 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]