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


person Andrea    schedule 13.11.2012    source источник
comment
Вы уже видели это: eed3si9n.com/learning-scalaz-day13?   -  person romanb    schedule 13.11.2012
comment
Нет, но кажется именно то, что я искал! :-)   -  person Andrea    schedule 13.11.2012
comment
@romanb Если вы опубликуете это как ответ, я буду рад принять его. (собственно для соблюдения политик StackExchange, было бы неплохо, если бы вы быстро резюмировали содержание)   -  person Andrea    schedule 13.11.2012


Ответы (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]
person romanb    schedule 13.11.2012