首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >的Scalaz类型类

的Scalaz类型类
EN

Stack Overflow用户
提问于 2016-04-17 04:15:35
回答 1查看 648关注 0票数 7

目标是实现不同类型的类(如半群、Monad、函子等)。由Scalaz为Spark的RDD (分布式集合)提供。不幸的是,我无法创建任何接受更高类型类型(如Monad、函子等)的类型类。和RDDs合作得很好。

RDDs被定义(简化)为:

代码语言:javascript
复制
abstract class RDD[T: ClassTag](){
   def map[U: ClassTag](f: T => U): RDD[U] = {...}
}

这里可以找到RDDs的完整代码。

下面是一个很好的例子:

代码语言:javascript
复制
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)
}

这里有一个不起作用的例子:

代码语言:javascript
复制
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和/或火花的情况下完成这项工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-17 04:56:56

简短答覆:否

对于像Functor这样的类型类,限制是对于any AB,不受约束,因为A => B有一个函数解除了RDD[A] => RDD[B]。在星火中,您不能选择任意的AB,因为您需要一个用于BClassTag,正如您所看到的。

对于其他类型类,如Semigroup,其类型在操作期间不会更改,因此不需要ClassTag,它可以工作。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36672606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档