Цепочка кошек, подтвержденная с помощью andThen

Я читаю эту статью

http://typelevel.org/cats/datatypes/validated.html

В нем говорится, что Validated можно использовать для последовательной проверки с использованием метода andThen. Это означает, что мы останавливаемся на первой ошибке и не собираем все ошибки.

Я пробовал следующий код

@ val x = 123.valid[String]
x: Validated[String, Int] = Valid(123)

@ val y = "foo".invalid[Int]
y: Validated[String, Int] = Invalid("foo")

@ x andThen y
cmd4.sc:1: type mismatch;
 found   : cats.data.Validated[String,Int]
 required: Int => cats.data.Validated[?,?]
val res4 = x andThen y
                     ^

Купить почему несовпадение типов. Как видите, x и y имеют одинаковую форму.

Изменить: обратите внимание, что я не хочу собирать все ошибки. Это я мог легко сделать с x |@| y. Я подтвердил и хочу обрабатывать их последовательно.


person Knows Not Much    schedule 20.04.2017    source источник
comment
то, что вы пытаетесь сделать, больше похоже на то, что вы искали аппликативный функтор. Вот пример с кошками / проверено: eed3si9n.com/herding-cats/Validated.html   -  person rethab    schedule 20.04.2017
comment
Нет, мне не нужны все ошибки. Я подтвердил, но на этот раз я хочу обрабатывать последовательно.   -  person Knows Not Much    schedule 20.04.2017


Ответы (1)


В ПОРЯДКЕ. Думаю, я нашел ответ, посмотрев здесь. Чтобы связать монады проверки, используя метод andthen. Вам нужна функция, которая берет правую часть первого проверенного, а затем создает еще один проверенный.

так что правильный код будет

@ val x = 123.valid[String]
val y = x: Validated[String, Int] = Valid(123)

@ val y = 234.valid[String]
y: Validated[String, Int] = Valid(234)

@ val foo = (i: Int) => y
foo: Int => Validated[String, Int] = $sess.cmd4$$$Lambda$2259/7469297@25f7739c

@ x andThen foo
res5: Validated[String, Int] = Valid(234)
person Knows Not Much    schedule 20.04.2017