scala - 通过方法类型参数分配给类型成员的值打破了类型等价

为什么下面的类型等价成立

trait Foo { type T }
val fa = new Foo { type T = Int }

implicitly[fa.T =:= Int] // OK

但是当类型成员 T 通过方法参数 A 分配时,类型等价性不成立

def makeFoo[A]: Foo = new Foo { type T = A }
val fb = makeFoo[Int]

implicitly[fb.T =:= Int] // ERROR

凭直觉我会期望如果 T = AA = Int 那么 T = Int?

最佳答案

这是因为 makeFoo 的返回类型只是 Foo 而不是 Foo { type T = A }。如果您没有显式声明它或者如果您优化它,错误就会消失。

def makeFoo[A] = new Foo { type T = A }
val fb = makeFoo[Int]

implicitly[fb.T =:= Int] // No more error

or

def makeFoo2[A]: Foo { type T = A } = new Foo { type T = A }
val fc: Foo { type T = Int } = makeFoo[Int]

implicitly[fc.T =:= Int] // No more error

Scastie :

<script src="https://scastie.scala-lang.org/knIfPcXqSQKXXCXJ2teHkg.js"></script>

https://stackoverflow.com/questions/61858945/

相关文章:

python - 生成最多 2 个重复的 3 个数字的列表

typescript - 如何使用可选的唯一字符串定义数组 typescript 接口(interf

swiftui - 我怎样才能在 SwiftUI 中实现类似于 radiogroup 的一种可能选择

forms - 如何判断表单字段在 vue.js 中是否无效

c - 使用 for 循环初始化一个数组,并将最终数组元素的值作为条件(在 C 中)

amazon-web-services - 有没有办法使用 aws cloudformation 更

swift - 如何不 dispatch 如此频繁?

react-native - React 导航 5(导航到另一个堆栈屏幕)

python - 将 Selenium 与 PyCharm CE 一起使用时的弃用问题

php - 如何解决 "The process has been signaled with sig