Синтаксис функции 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 в случае сбоя? Там нет кортежа в поле зрения!

Ответы на вопрос(1)

Ваш ответ на вопрос