锁定 。这个问题及其答案被锁定,因为这个问题离题但具有历史意义。它目前不接受新的答案或交互。
我刚刚开始研究即将发布的 2.8版本中的* Scala 集合库重新实现。熟悉 2.7 中的库的人会注意到,从使用的角度来看,该库几乎没有变化。例如… *
> List("Paris", "London").map(_.length) res0: List[Int] List(5, 6)
…在任何一个版本中都可以使用。 该库非常有用 :事实上它太棒了。然而,那些以前不熟悉 Scala 并 四处探索以了解该语言的 人现在必须理解方法签名,例如:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
对于如此简单的功能,这是一个令人生畏的签名,我发现自己很难理解。 并不是说我认为 Scala 有可能成为下一个 Java (或 /C/C++/C#)——我不相信它的创造者将它瞄准了那个市场——但我认为 Scala 成为/肯定是可行的下一个 Ruby 或 Python(即获得重要的商业用户群)
Steve Yegge 曾经攻击过 Scala(在我看来是错误的),因为他认为 Scala 的类型系统过于复杂。我担心有人会用这个 API 来散布FUD(类似于 Josh Bloch 如何吓唬JCP不向 Java 添加闭包)。
注意 - 我应该明确一点,虽然我相信 Joshua Bloch在拒绝 BGGA 关闭提案方面具有影响力,但我不会将此归因于他诚实地认为该提案代表错误的信念。
不管我的妻子和同事一直告诉我什么,我不认为我是个白痴:我在牛津大学获得了很好的数学学位,我已经从事商业编程将近 12 年,并且在Scala中工作了大约一年(也是商业)。
请注意,煽动性主题标题是 对 1980 年代初期英国政党宣言的引用。这个问题是主观的,但它是一个真实的问题,我已经把它变成了 CW,我想就此事发表一些意见。
我希望这不是“遗书”,但我明白你的意思。您发现了 Scala 的优点和问题同时是什么:它的 可扩展性 。这让我们可以在库中实现大多数主要功能。在其他一些语言中,类似map或collect将内置的序列,没有人需要看到编译器必须经过的所有循环才能使它们顺利运行。在 Scala 中,它都在一个库中,因此是公开的。
map
collect
事实上,map它的复杂类型所支持的功能是相当先进的。考虑一下:
scala> import collection.immutable.BitSet import collection.immutable.BitSet scala> val bits = BitSet(1, 2, 3) bits: scala.collection.immutable.BitSet = BitSet(1, 2, 3) scala> val shifted = bits map { _ + 1 } shifted: scala.collection.immutable.BitSet = BitSet(2, 3, 4) scala> val displayed = bits map { _.toString + "!" } displayed: scala.collection.immutable.Set[java.lang.String] = Set(1!, 2!, 3!)
看看你如何总是得到最好的类型?如果你将Ints 映射到Ints,你会再次得到 a BitSet,但是如果你将Ints 映射到Strings,你会得到一个 general Set。map 结果的静态类型和运行时表示都取决于传递给它的函数的结果类型。即使集合为空,这也有效,因此永远不会应用该函数!据我所知,没有其他具有等效功能的集合框架。然而,从用户的角度来看,这就是事情 应该 如何运作的方式。
Int
BitSet
String
Set
我们遇到的问题是,使这种情况发生的所有聪明技术都泄漏到了变得庞大而可怕的类型签名中。但也许默认情况下不应该向用户显示完整的类型签名map?如果她抬头看map她BitSet得到:
map(f: Int => Int): BitSet (click here for more general type)
在这种情况下,文档不会说谎,因为从用户的角度来看, map 确实具有 type (Int => Int) => BitSet。但map也有更通用的类型,可以通过单击另一个链接进行检查。
(Int => Int) => BitSet
我们还没有在我们的工具中实现这样的功能。但我相信我们需要这样做,以避免吓跑人们并提供更多有用的信息。有了这样的工具,希望智能框架和库不会成为遗书。