延迟类型推断?

时间:2019-05-19 09:02:20

标签: scala

鉴于以下内容无法编译

trait Wrapper[T]{
    def apply[U](f: U) = f(this)
}
trait Mapper{
    def apply[V](w: Wrapper[V]): Option[V]
}

我们如何编写Wrapper.apply以便这样的实例可以接受Mapper实例?

问题是我无法正确约束U,因为使用的函数(Mapper.apply)本身是通用的。

由于该函数是通用的,因此我也无法“提升” Mapper.apply的输入/输出类型以键入成员。

2 个答案:

答案 0 :(得分:0)

  

我们如何编写Wrapper.apply以便这样的实例可以接受Mapper实例?

好吧,def apply(f: Mapper) = f(this)

trait Wrapper[T]{
    def apply[U](f: Wrapper[T] => U) = f(this)
}

val wrapper: Wrapper[Int] = ...
val mapper: Mapper = ...
wrapper.apply(mapper(_))

尽管这实际上并不能直接接受Mapper实例。

当然,您可以将Mapper接受方法和函数接受方法都作为重载。

答案 1 :(得分:0)

也许是这样吗?

trait Wrapper[T]{
  final def apply[U >: T](m: Mapper[U]): Option[T] = m(this)
}

trait Mapper[-T] {
  def apply[V <: T](w: Wrapper[V]): Option[V]
}

如果您可以分享一个用例示例,那么我可以确定这是否是您所需要的。