scala - 如何使用抽象类型的类型约束

标签 scala types

鉴于以下代码:

trait S { type T }
case class A(t: Seq[String]) extends S { type T = Seq[String] }

我不明白这个编译错误:
似乎没有使用证据。
def f[S<:A, X](g: => Seq[X])(implicit ev: S#T =:= Seq[X]) = new A(g)

<console>:50: error: type mismatch;
 found   : Seq[X]
 required: Seq[String]
       def f[S<:A, X](g: => Seq[X])(implicit ev: S#T =:= Seq[X]) = new A(g)

最佳答案

对于它看起来有多傻,交换 =:= 的顺序操作数解决问题

def f[S<:A, X](g: => Seq[X])(implicit ev: Seq[X] =:= S#T) = new A(g)

谢谢你,斯卡拉克。

解释

当你说 implicit ev S#T =:= Seq[X] ,编译器提供了从 S#T 的隐式转换至 Seq[X] .但是,它不提供来自 Seq[X] 的等效转换。至 S#T ,这就是愚蠢的部分:平等不应该是可交换的吗?

这里有一些关于这个主题的额外细节:http://typelevel.org/blog/2014/07/02/type_equality_to_leibniz.html

关于scala - 如何使用抽象类型的类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296022/

相关文章:

带有或匹配的 Scala 保护模式

scala - 防止 akka actor 重启子 actor

php - 在mysql中,int和float数据类型在性能上有什么区别?

java - Groovy/Java 可以隐式转换为子类(或具有自定义隐式转换)吗?

具有特定深度的 TypeScript 递归类型

scala - 如何忽略解析器组合器中的单行注释

scala - <:< operator work in Scala?如何

scala - 如何根据配置文件在sbt中设置依赖范围?

arrays - Julia 数组是否同构?

haskell - 新类型的数据构造函数中的函数定义示例