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]
第二个方法所期望的函数:故障情况下Tuple2 / Pair发生了什么?发布于 2018-05-10 15:16:41
M
是Scalaz的主要皮条客之一MA的一个类型参数,它表示pimped值的类型构造函数(也称为高固定类型)。这种类型的构造函数用于查找Functor
和适当实例Apply
,这些是对方法的隐式需求<**>
。
trait MA[M[_], A] {
val value: M[A]
def <**>[B, C](b: M[B], z: (A, B) => C)(implicit t: Functor[M], a: Apply[M]): M[C] = ...
}
https://stackoverflow.com/questions/-100003334
复制相似问题