2015-10-07 4 views
5

В Nick Partridge's presentation on deriving scalaz, на базе старой версии scalaz, он вводит валидации с использованием функции:scalaz 7 эквивалента `<|*|>` от scalaz 6

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) 
      ^

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

+0

не вы, а хотите ли использовать '| @ |' оператор? Видео, которое вы опубликовали, не упоминает об этом, но вы можете узнать об этом подробнее: http://eed3si9n.com/learning-scalaz/Validation.html – mjaskowski

+0

В частности, вы можете написать 'scala> (even (1) | @ | even (2) | @ | even (3)) {_ + _ + _} '' Ошибка (NonEmptyList (даже не: 1, даже не: 3)) 'и ' scala> (даже (2) | @ | even (4) | @ | even (6)) {_ + _ + _}) '' Успех (12) ' – mjaskowski

+0

@mjaskowski' | @ | 'очень общий, и в тех случаях, когда вы просто хотите для zip вместе два значения в кортеже, 'tuple' (ранее известный как' <|*|> ') более уместен. –

ответ

5

Это теперь называется 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 ТЕГА источник, поиск, а затем сравнение подписей.

+1

Существовал аннотации для устаревания, указывающей один на 'tuple' в 7.0, но это, естественно, в 7.1. – Hugh

+0

Опечатка. failNel должен быть failNel –

+0

@Cloudtech 'failNel' все еще вокруг в 7.1, но он устарел, поэтому я его изменил. –

-1

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

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)) 
+2

Вы определенно _can_ используете '| @ |' здесь, но я не вижу никаких указаний на то, что это OP _wants_. '| @ |' существовал в Scalaz 6 и делал то же самое, что и в 7-'<|*|>', это нечто более конкретное, с измененным именем. –

+0

Какая польза от 'tuple' над' | @ | 'в сценарии проверки? – mjaskowski

+0

Почему сценарий имеет значение? Когда вы хотите кортеж, «tuple» является более точным, менее мощным, более читаемым и более понятным в отношении намерения, чем '| @ |' - вот все причины, чтобы предпочесть его. –