soc*_*soc 12 generics types scala existential-type
例如,List[T] forSome { type T }等同于List[_],但这是否适用于每种可能的用法,forSome或者是否存在forSome无法用等效的第二种语法替换的情况?
oxb*_*kes 15
不,并非所有用法都可以如此转换.像这样的东西(感谢返璞词,下面,谁应该得到在这一个upvotes)
def foo(xs: Map[T, T] forSome { type T})
Run Code Online (Sandbox Code Playgroud)
这里的要点是我可以在不止一个地方使用存在主义,但它是相同的存在主义.显然,如果你使用通配符,你会指的是不同的存在
ret*_*nym 14
_在此上下文中是"存在类型的占位符语法",在语言规范的 3.2.10中描述.
这个名字听起来很像_"匿名函数的占位符语法".此简写不能用于所有功能.例如:
(a: A) => f(g(a))
f(g(_: A)) // WRONG, this means f((a: A) => g(a))
Run Code Online (Sandbox Code Playgroud)
我们可以为存在构建一个类似的例子,它不能被表示_:
F[G[A]] forSome { type A }
F[G[_]] // WRONG, this means F[G[A] forSome { type A }]
Run Code Online (Sandbox Code Playgroud)
旁注:存在性不是值级函数的类型级别模拟.那将是:
({type l[A] = F[G[A]])#l
Run Code Online (Sandbox Code Playgroud)
事实上,很可惜Scala使用下划线来存在,而不是类型级函数.
UPDATE
让我以同样的方式构建@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 }
Run Code Online (Sandbox Code Playgroud)