scala编译器在使用scalaz函数编译foldleft时抱怨很奇怪

时间:2012-02-06 16:57:24

标签: scala scalaz

我最近碰巧使用scalaz >>=。我将所有应该与>>=绑定的方法放在列表中,foldleft如下所示,

val dataMap:Map[K,V]

def call[F](funcList:List[funcOb[K, V, F]]):Either[F,Seq[(K,Option[V])]] = {
  type t[a] = Either[F,a]
  funcList.
    map(v => {
      v.funcs.
        foldLeft((v.name,dataMap.get(v.name)).right[F])( _ >>= _ )
    }
  ).sequence[t,(K,Option[V])]
}

case class funcOb[K,V,F]( name:K,
     funcs:List[(K,Option[V]) => Either[F, (K, Option[V])]] = List.empty )

现在我收到一个有趣的错误,抱怨所需的内容类似于找到

...: type mismatch;
[error]  found   : (K, Option[V]) => Either[F,(K, Option[V])]
[error]  required: (K, Option[V]) => Either[F,(K, Option[V])]
[error]             foldLeft((v.name,dataMap.get(v.name)).right[F])( _ >>= _ )

我无法理解这种行为。有什么遗漏吗?

1 个答案:

答案 0 :(得分:2)

需要Function1[(A, B), C]。您的列表包含Function2[A, B, C]类型的函数。因此,您需要先将函数转换为tupled形式,然后才能应用它。

以下作品:

def call[F](funcList: List[funcOb[K, V, F]]): Either[F, Seq[(K, Option[V])]] = {
  type t[a] = Either[F, a]
  funcList.
    map(v => {
      v.funcs.
        foldLeft((v.name, dataMap.get(v.name)).right[F])(_ >>= _.tupled)
    }
  ).sequence[t, (K, Option[V])]
}