0

我更喜欢使用类型类但有一些问题:鉴于以下接口

trait Processor[A] {
  def process[B](f: A => B): Processor[B]
}

我有一个Ordering[A]出于其他原因需要的实现。因此,该方法process需要一个Ordering[B]来构造一个Processor[B]。以下是我想做的,但它显然不起作用:

class Plant[A, OA <: Ordering[A]] extends Processor[A] {
  def process[B:Ordering](f: A => B): Processor[B] = null // Plant[B, OB <: Ordering[B]]
}

我怎样才能提供Ordering[B]实施process

我知道这样做的原因是,它Ordering[A]作为隐式的第二个参数传递。我不知道但不应该对类似于 Haskell 的 Scala 中的类型类提供特殊支持,以便在没有这种“解决方法”的情况下在上面的实现中识别我想要的(只允许B具有 s 的 s )?Ordering

4

2 回答 2

1

不,这根本不应该工作。鉴于您对 的定义Processor,此代码将编译:

val processor: Processor[Int] = foo() // foo() is some function that returns a Processor
processor.process[Object](x => new Object())

现在 iffoo实际实现为

def foo() = new Plant[Int]()

那么它的process方法将不适用于B = Object.

于 2013-08-09T06:08:13.030 回答
0

我不确定我是否完全理解您要实现的目标,但也许您可以Processor在上下文绑定上进行通用化?

trait Processor[A, Bound[_]] {
  def process[B: Bound](f: A => B): Processor[B, Any]
}

class Plant[A: Ordering] extends Processor[A, Ordering] {
  def process[B: Ordering](f: A => B) = ???
}
于 2013-08-09T06:25:26.917 回答