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