scalaz中的函数语法益智游戏

时间:2010-03-30 12:51:01

标签: scala functional-programming scala-2.8 scalaz

在关于导出Nick Partidge's presentationscalaz之后,我开始看这个例子,这真是太棒了:

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)

所以我有几个问题:

  1. 为什么该方法似乎采用了一个类型参数(M[B])的更高通道类型,但可以通过Validation(它有两个类型的参数) ?
  2. 语法(_: A, _: B)定义了第二种方法所期望的函数(A, B) => Pair[A,B]在失败的情况下,Tuple2 / Pair发生了什么?看不到任何元组!

1 个答案:

答案 0 :(得分:64)