【发布时间】:2012-03-15 19:56:35
【问题描述】:
例如,List[T] forSome { type T } 等价于List[_],但对于forSome 的所有可能用法是否都是如此,或者在某些情况下forSome 不能被第二个语法的等价物替换?
【问题讨论】:
标签: generics scala types existential-type
例如,List[T] forSome { type T } 等价于List[_],但对于forSome 的所有可能用法是否都是如此,或者在某些情况下forSome 不能被第二个语法的等价物替换?
【问题讨论】:
标签: generics scala types existential-type
不,不是所有的用法都可以这样转换。像这样的东西(感谢下面的 retronym,谁应该得到这个投票的支持)
def foo(xs: Map[T, T] forSome { type T})
这里的重点是我可以在多个地方使用存在主义,但它是同一个存在主义。显然,如果您使用通配符,您将指代不同的存在
【讨论】:
forSome 构造。
_ 在此上下文中是“现有类型的占位符语法”,在language specification 的 3.2.10 中进行了描述。
这个名字听起来很像_ 的另一种用法,“匿名函数的占位符语法”。此速记不能用于所有功能。例如:
(a: A) => f(g(a))
f(g(_: A)) // WRONG, this means f((a: A) => g(a))
我们可以为existentials构造一个类似的例子,无法表示_:
F[G[A]] forSome { type A }
F[G[_]] // WRONG, this means F[G[A] forSome { type A }]
旁注:存在式不是价值级别函数的类型级别模拟。那将是:
({type l[A] = F[G[A]])#l
事实上,遗憾的是 Scala 使用下划线表示存在,而不是类型级别的函数。
更新
让我用同样的方式框定@oxbow_lakes'的答案:
(a: A) => h(a, a)
h(_, _) // WRONG, this means (a, b) => f(a, b)
H[A, A] forSome { type A }
H[_, _] // WRONG, this means H[A, B] forSome { type A; type B }
【讨论】: