繁体   English   中英

Scala 隐式转换的问题

[英]Issue with Scala Implicit Conversions

在下面的代码摘录中,最后一条语句无法编译。 但是,紧接在该语句之前的语句确实可以编译。 这个倒数第二个语句是我期望编译器将最后一个语句转换为的语句。 我不明白为什么它不起作用。 任何帮助表示赞赏。

trait ParameterizedBy[A, B] {
    val parameterized: B
  }

object ParameterizedBy {
  implicit def toParameterized[A, B, C](p: ParameterizedBy[A, B])(
    implicit f: B => C): C = f(p.parameterized)
}

trait Wraps[A] {
  val wrapped: A
}

object Wraps {
  implicit def toWrapped[A](w: Wraps[A]): A = w.wrapped
}

val p = new ParameterizedBy[String, Wraps[Int]] {
  override val parameterized: Wraps[Int] = new Wraps[Int] {
    override val wrapped = 6
  }
}

ParameterizedBy.toParameterized(p)(Wraps.toWrapped) + 5

p + 5

将方法隐式转换为A => C是有问题的,因为编译器无法轻松枚举具有预期方法+所有可能类C ,然后去搜索所有可能采用B并给出C - 这种搜索需要永远。

对于未知类型C我建议避免B => C类型的隐式参数。 如果你想要一个转换器,那么给它一些特定的名字,例如

trait Unwrap[A, B] extends (A => B)

然后你只在这个链式隐式中使用。

您可能会尝试的粗略草图:

import scala.language.implicitConversions

trait ParameterizedBy[A, B] {
    val parameterized: B
  }

object ParameterizedBy {
  implicit def toParameterized[A, B, C](p: ParameterizedBy[A, B])(
    implicit f: Unwrap[B, C]): C = f(p.parameterized)
}

trait Wraps[A] {
  val wrapped: A
}

object Wraps {
  implicit def toWrapped[A](w: Wraps[A]): A = w.wrapped
}

trait Unwrap[A, B] extends (A => B)

object Unwrap {
  implicit def unwrap[A]: Unwrap[Wraps[A], A] = new Unwrap[Wraps[A], A] {
    def apply(w: Wraps[A]): A = w.wrapped
  }
}

val p = new ParameterizedBy[String, Wraps[Int]] {
  override val parameterized: Wraps[Int] = new Wraps[Int] {
    override val wrapped = 6
  }
}

p - 5         // works
(p: Int) + 5  // works with type ascription (to avoid conflicts with `+ String`)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM