2012-02-25 81 views
63

我发现下面的代码片段:Scala forSome关键字是什么?

List[T] forSome { type T } 

forSome看起来像一个方法,但我的朋友告诉我,这是一个关键字。

我使用了它,但发现了几个关于forSome的文档。这是什么意思,我在哪里可以得到一些关于它的文件?

回答

43

forSome关键字用于定义Scala中的存在类型。有这个斯卡拉glossary页面解释他们是什么。我无法在Scala文档中找到详细解释它们的地方,因此here是我在Google上发现的一篇博客文章,解释了它们的用途。

更新:您可以在Scala specification中找到存在类型的精确定义,但它非常密集。

要总结一些我链接到的帖子,存在类型在你想操作某些东西但不关心其中的类型细节时非常有用。例如,要在数组操作但不关心什么样数组:

def printFirst(x : Array[T] forSome {type T}) = println(x(0)) 

,你同样可以做到与方法的类型变量:

def printFirst[T](x : Array[T]) = println(x(0)) 

但你在某些情况下可能不想添加类型变量。您还可以添加绑定到该类型的变量:

def addToFirst(x : Array[T] forSome {type T <: Integer}) = x(0) + 1 

另请参阅this blog post这是我得到了这个例子。

+0

@JanekBogucki上述链接无效。 – jpcooper 2016-10-25 16:38:17

+0

http://www.scala-lang.org/news/roadmap-next.html - “for some syntax is eliminated。” – 2016-10-27 09:00:30

+0

forSome将在“Don Giovanni”发行版中删除:https://www.scala-lang.org/news/roadmap-next.html – 2017-01-27 10:57:10

3

我不知道斯卡拉,但你的问题拿起我的兴趣,并开始谷歌搜索。

我发现,在Scala's changelog

“现在可以使用新的关键字 forSome定义生存类型的存在的类型的形式T forSome {Q}其中Q是一个有价值的 序列和/或类型声明“。

+5

有些信息也可以在[Scala规格](http://www.scala-lang.org/docu/files/ScalaReference.pdf)中找到,第26页 – 2012-02-25 14:49:46

+1

当前规格:http://www.scala -lang.org/files/archive/spec/2.11/03-types.html#existential-types – 2014-09-30 21:15:17