`forSome`的所有用法都可以用等效的`_`代替吗?

时间:2012-02-25 17:55:36

标签: generics scala types existential-type

例如,List[T] forSome { type T }相当于List[_],但对于forSome的每种可能用途都是如此,或者是forSome无法替换为{{1}}的情况第二种语法?

2 个答案:

答案 0 :(得分:15)

不,并非所有用法都可以如此转换。这样的事情(感谢反名词,下面,谁应该得到这个的赞成票)

def foo(xs: Map[T, T] forSome { type T})

这里的要点是我可以在不止一个地方使用存在主义但它是相同的存在主义。显然,如果你使用通配符,你会指的是不同的存在

答案 1 :(得分:14)

在此上下文中,

_language specification的3.2.10中描述的“存在类型的占位符语法”。

该名称听起来很像_,“匿名函数的占位符语法”的另一种用法。此简写不能用于所有功能。例如:

(a: A) => f(g(a))
f(g(_: A)) // WRONG, this means f((a: A) => g(a))

我们可以为存在性构建一个类似的例子,这个例子无法表示_

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 }