Управление импортом в 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?

1 12

1 ответ:

Этот пост в блоге подробно объясняет структуру пакета и импортирует a la carte в scalaz7: http://eed3si9n.com/learning-scalaz-day13

Для ваших конкретных примеров, для 3.сбой [строка] вам понадобится:

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]