【问题标题】:Scala type projection with higher-kinded type具有更高种类的Scala类型投影
【发布时间】:2015-11-25 13:27:37
【问题描述】:

考虑以下几点:

trait Foo {
  type F[_]
  type A
  type FA = F[A]
  def get: FA
}

class SeqStringFoo extends Foo {
  type F[_] = Seq[_]
  type A = String
  def get: Seq[String] = Seq("hello world")
}

def exec[F <: Foo](foo: F): F#FA = foo.get

val seq1: Seq[Any] = exec(new SeqStringFoo()) // Seq[Any] = List(hello world)
val seq2: Seq[String] = exec(new SeqStringFoo()) // Error: Expression SeqIntFoo#FA doesn't conform to Seq[String]

seq2 无法编译,因为由于某种原因,包装类型 String 的类型信息在使用 type projection F#FA 时会丢失。

当返回的类型不是更高种类的类型时,不会发生这种情况。

为什么会这样?

我该如何解决这个问题?

【问题讨论】:

    标签: scala higher-kinded-types type-projection


    【解决方案1】:

    看起来你只是忘记在专业化中为 F[_] 传递类型变量,试试:

    class SeqStringFoo extends Foo {
      type F[x] = Seq[x]
      type A = String
      def get: FA = Seq("hello world")
    }
    

    在其他情况下,您总是为任何F[_]F[Int]F[String])返回Seq[_](== Seq[Any]

    【讨论】:

    • 甚至不知道type variable 这样的东西存在。每天学习新东西。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多