scala - 标记类型中的协方差

标签 scala functional-programming scalaz

我从 Miles Sabin 要点示例中创建了此类标记类型:

  type Tagged[U] = { type Tag = U }
  type @@[T, U] = T with Tagged[U]

  sealed trait A
  sealed trait E
  sealed trait B extends E
  sealed trait C extends E
  def a(a: String): String @@ A = a.asInstanceOf[String @@ A]
  def b(a: String): String @@ B = a.asInstanceOf[String @@ B]
  def c(a: String): String @@ C = a.asInstanceOf[String @@ C]

我有一个方法:

 def f(e: String @@ E) = ???

我希望此方法同时采用 String @@ BString @@ C 类型,因为 BC 扩展 E。我该怎么做?我尝试使 @@ 协变:

type Tagged[U] = { type Tag = U }
type @@[T, +U] = T with Tagged[U]

但这没有帮助 - 我只能传递 String @@ E 类型的对象。

最佳答案

怎么样

def f[T <: E](e: String @@ T) = println(e)
f(b("1")) // 1
f(c("2")) // 2

关于scala - 标记类型中的协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36541740/

相关文章:

Scala 编译错误 : "No implicit view available" and "diverging implicit expansion"

scala - 如何清理连续 Akka 流中的子流

javascript - 将 compose 函数从 javascript 翻译为 python,函数式方式

parsing - 从 Scala 字符串中去除 HTML 标签

c++ - 使用 std::function 和通用 lambda 的函数重载:std::string 优于 int

scala - scala 有恒等函数吗?

scala - 可以使用 scalaz Arrow 组合吗?

scala - 用于在我的 Scalaz 析取中联合不相关的失败案例的类型类

scala - 为无形 hlist 定义 scalaz monad 实例

scala - 您将如何在 Scala 中实现缓存方面