Синтаксис функции puzzler в скалязе
После просмотраПрезентация Ника Партиджа по получениюscalazЯ посмотрел на этот пример, который просто потрясающий:
import scalaz._
import Scalaz._
def even(x: Int) : Validation[NonEmptyList[String], Int]
= if (x % 2 ==0) x.success else "not even: %d".format(x).wrapNel.fail
println( even(3) <|*|> even(5) ) //prints: Failure(NonEmptyList(not even: 3, not even: 5))
Я пытался понять, что<|*|>
метод делал, вот исходный код:
def <|*|>[B](b: M[B])(implicit t: Functor[M], a: Apply[M]): M[(A, B)]
= <**>(b, (_: A, _: B))
Хорошо, это довольно запутанно (!) - но оно ссылается на<**>
метод, который объявлен так:
def <**>[B, C](b: M[B], z: (A, B) => C)(implicit t: Functor[M], a: Apply[M]): M[C]
= a(t.fmap(value, z.curried), b)
Итак, у меня есть несколько вопросов:
Как получилось, что методвысший тип одного типа параметра (M[B]
) но может пройти мимоValidation
(который имеет два типа параметров)?Синтаксис(_: A, _: B)
определяет функцию(A, B) => Pair[A,B]
2-й метод ожидает:что происходит с Tuple2 / Pair в случае сбоя? Там нет кортежа в поле зрения!