Apache Spark RDD的Scalaz类型类

Apache Spark RDD的Scalaz类型类,scala,apache-spark,functional-programming,rdd,scalaz,Scala,Apache Spark,Functional Programming,Rdd,Scalaz,目标是实现Scalaz为Spark的RDD(分布式集合)提供的不同类型的类(如半群、单子、函子等)。不幸的是,我无法使任何类型类采用更高级的类型(如Monad、Functor等)来很好地与rdd一起工作 RDD定义(简化)为: 可以找到RDD的完整代码 下面是一个很好的例子: import scalaz._, Scalaz._ import org.apache.spark.rdd.RDD implicit def semigroupRDD[A] = new Semigroup[RDD[A]]

目标是实现Scalaz为Spark的RDD(分布式集合)提供的不同类型的类(如半群、单子、函子等)。不幸的是,我无法使任何类型类采用更高级的类型(如Monad、Functor等)来很好地与rdd一起工作

RDD定义(简化)为:

可以找到RDD的完整代码

下面是一个很好的例子:

import scalaz._, Scalaz._
import org.apache.spark.rdd.RDD

implicit def semigroupRDD[A] = new Semigroup[RDD[A]] {
   def append(x:RDD[A], y: => RDD[A]) = x.union(y)
}
以下是一个不起作用的示例:

implicit def functorRDD =  new Functor[RDD] {
   override def map[A, B](fa: RDD[A])(f: A => B): RDD[B] = {
      fa.map(f)
   }
}
这在以下情况下失败:

错误:没有可用于B的类标记 fa.地图(f)

错误很明显。RDD中实现的映射需要一个类标记(见上文)。ScalaZ函子/单子等没有类标记甚至可以在不修改Scalaz和/或Spark的情况下完成这项工作吗?

简短回答:不可以

对于像
Functor
这样的类型类,限制是对于任何
A
B
,在
A=>B
给定的情况下,您有一个取消的
RDD[A]=>RDD[B]
。在Spark中,您不能选择任意的
A
B
,因为您需要
ClassTag
作为
B
,如您所见


对于其他类型类,如
半群
,其类型在操作过程中不会改变,因此不需要
类标记
,它也可以工作。

这也是我的结论。
implicit def functorRDD =  new Functor[RDD] {
   override def map[A, B](fa: RDD[A])(f: A => B): RDD[B] = {
      fa.map(f)
   }
}