目标是实现不同类型的类(如半群、Monad、函子等)。由Scalaz为Spark的RDD (分布式集合)提供。不幸的是,我无法创建任何接受更高类型类型(如Monad、函子等)的类型类。和RDDs合作得很好。
RDDs被定义(简化)为:
abstract class RDD[T: ClassTag](){
def map[U: ClassTag](f: T => U): RDD[U] = {...}
}这里可以找到RDDs的完整代码。
下面是一个很好的例子:
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 ClassTag fa.map(f)没有可用的
错误很明显。在RDD中实现的映射需要一个ClassTag (参见上文)。ScalaZ函子/单子等,没有ClassTag。甚至可以在不修改Scalaz和/或火花的情况下完成这项工作吗?
发布于 2016-04-17 04:56:56
简短答覆:否
对于像Functor这样的类型类,限制是对于any A和B,不受约束,因为A => B有一个函数解除了RDD[A] => RDD[B]。在星火中,您不能选择任意的A和B,因为您需要一个用于B的ClassTag,正如您所看到的。
对于其他类型类,如Semigroup,其类型在操作期间不会更改,因此不需要ClassTag,它可以工作。
https://stackoverflow.com/questions/36672606
复制相似问题