scalaz の導出に関するNick Partidge のプレゼンテーションを見た後、私はこの例を見なければなりませんでした。
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))
OK、それはかなり紛らわしい (!) - しかし、次の<**>
ように宣言されているメソッドを参照しています。
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)
だから私はいくつかの質問があります:
- このメソッドは、1 つの型パラメーター ( )のより高次の型を受け取るように見えますが、 (2 つの型パラメーターを持つ) を渡すことができるのはなぜですか?
M[B]
Validation
- 構文は、2 番目のメソッドが期待する
(_: A, _: B)
機能を定義します。タプルが見えない!(A, B) => Pair[A,B]