scalaz 7 эквивалент `‹|*|›` из scalaz 6

В презентации Ника Партриджа о получении scalaz, основанной на старой версии scalaz, он вводит проверки с помощью функции:

def even(x: Int): Validation[NonEmptyList[String], Int] =
  if (x % 2 == 0) x.success else { s"not even: $x".wrapNel.failure }

Затем он объединяет это, используя

even(1) <|*|> even(2)

который применяет тест и возвращает подтверждение с сообщением об ошибке. Используя scalaz 7, я получаю

scala> even(1) <|*|> even(2)
<console>:18: error: value <|*|> is not a member of scalaz.Validation[scalaz.NonEmptyList[String],Int]
       even(1) <|*|> even(2)
               ^

Что такое scalaz 7 эквивалент этого комбинатора?


person Joe Kearney    schedule 07.10.2015    source источник
comment
Разве вы не хотели бы использовать оператор |@|? В опубликованном вами видео это не упоминается, но вы можете узнать больше об этом здесь: eed3si9n.com/ Learning-scalaz/Validation.html   -  person mjaskowski    schedule 08.10.2015
comment
В частности, вы можете написать scala> (even(1) |@| even(2) |@| even(3)) { _ + _ + _} <console>Failure(NonEmptyList(not even: 1, not even: 3)) и scala> (even(2) |@| even(4) |@| even(6)) { _ + _ + _}) <console> Success(12)   -  person mjaskowski    schedule 08.10.2015
comment
@mjaskowski |@| является очень общим, и в тех случаях, когда вы просто хотите объединить два значения в кортеж, более подходящим является tuple (ранее известный как <|*|>).   -  person Travis Brown    schedule 08.10.2015


Ответы (2)


Теперь это называется tuple, поэтому вы можете написать, например:

import scalaz._, Scalaz._

def even(x: Int): Validation[NonEmptyList[String], Int] =
  if (x % 2 == 0) x.success else s"not even: $x".failureNel

val pair: ValidationNel[String, (Int, Int)] = even(1) tuple even(2)

К сожалению, я не уверен, что есть лучший способ выяснить такие вещи, чем проверка последнего тега 6.0 источника, поиск и сравнение сигнатур.

person Travis Brown    schedule 07.10.2015
comment
В 7.0 была аннотация об устаревании, указывающая на tuple, но, естественно, она исчезла в 7.1. - person Hugh; 08.10.2015
comment
Есть опечатка. failNel должен быть сбойNel - person Xiaohe Dong; 08.10.2015
comment
@Cloudtech failNel все еще существует в версии 7.1, но он устарел, поэтому я изменил его. - person Travis Brown; 08.10.2015

Вы хотите использовать оператор |@|.

scala> (even(1) |@| even(2) |@| even(3)) { (_,_,_) }
<console> Failure(NonEmptyList(not even: 1, not even: 3))

scala> (even(2) |@| even(4) |@| even(6)) { (_,_,_) }
<console> Success((2,4,6))

сравните это с оператором tuple:

scala> even(1) tuple even(2) tuple even(3)
<console> Failure(NonEmptyList(not even: 1, not even: 3))

scala> even(2) tuple even(4) tuple even(6)
<console> Success(((2,4),6))
person mjaskowski    schedule 07.10.2015
comment
Вы определенно можете использовать |@| здесь, но я не вижу никаких указаний на то, что ОП хочет этого. |@| существовал в Scalaz 6 и делал то же самое, что и в 7 — <|*|> — это нечто более конкретное, имя которого было изменено. - person Travis Brown; 08.10.2015
comment
Что хорошего в tuple по сравнению с |@| в сценарии Валидации? - person mjaskowski; 08.10.2015
comment
Почему важен сценарий? Если вам нужен кортеж, tuple является более точным, менее мощным, более читаемым и более понятным в отношении намерений, чем |@| — все это причины для его предпочтения. - person Travis Brown; 08.10.2015
comment
В любом случае, для тех, кто изучает валидацию, знание |@| не менее важно, чем знание tuple. И в конкретном рассматриваемом примере оба хороши. - person mjaskowski; 08.10.2015