小编典典

Scala 2.8 收藏库是“历史上最长的遗书”吗?

all

锁定 。这个问题及其答案被锁定,因为这个问题离题但具有历史意义。它目前不接受新的答案或交互。

我刚刚开始研究即将发布的 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(即获得重要的商业用户群)

  • 这会阻止人们来 Scala 吗?
  • 这是否会让 Scala 在商业世界中名声扫地,成为只有敬业的博士生才能理解的 学术玩物? CTO和软件负责人会被吓跑吗?
  • 图书馆重新设计是一个明智的想法吗?
  • 如果你在商业上使用 Scala,你会担心这个吗?您打算立即采用 2.8 还是等着看会发生什么?

Steve Yegge 曾经攻击过
Scala
(在我看来是错误的),因为他认为 Scala 的类型系统过于复杂。我担心有人会用这个 API
来散布FUD(类似于 Josh
Bloch 如何吓唬JCP不向 Java
添加闭包)。

注意 - 我应该明确一点,虽然我相信 Joshua
Bloch
在拒绝 BGGA
关闭提案方面具有影响力,但我不会将此归因于他诚实地认为该提案代表错误的信念。


不管我的妻子和同事一直告诉我什么,我不认为我是个白痴:我在牛津大学获得了很好的数学学位,我已经从事商业编程将近
12
年,并且在Scala中工作了大约一年(也是商业)。

请注意,煽动性主题标题是 对 1980
年代初期英国政党宣言的引用
。这个问题是主观的,但它是一个真实的问题,我已经把它变成了
CW,我想就此事发表一些意见。


阅读 93

收藏
2022-03-01

共1个答案

小编典典

我希望这不是“遗书”,但我明白你的意思。您发现了 Scala 的优点和问题同时是什么:它的 可扩展性
。这让我们可以在库中实现大多数主要功能。在其他一些语言中,类似mapcollect将内置的序列,没有人需要看到编译器必须经过的所有循环才能使它们顺利运行。在
Scala 中,它都在一个库中,因此是公开的。

事实上,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
结果的静态类型和运行时表示都取决于传递给它的函数的结果类型。即使集合为空,这也有效,因此永远不会应用该函数!据我所知,没有其他具有等效功能的集合框架。然而,从用户的角度来看,这就是事情
应该 如何运作的方式。

我们遇到的问题是,使这种情况发生的所有聪明技术都泄漏到了变得庞大而可怕的类型签名中。但也许默认情况下不应该向用户显示完整的类型签名map?如果她抬头看mapBitSet得到:

map(f: Int => Int): BitSet     (click here for more general type)

在这种情况下,文档不会说谎,因为从用户的角度来看, map 确实具有 type (Int => Int) => BitSet。但map也有更通用的类型,可以通过单击另一个链接进行检查。

我们还没有在我们的工具中实现这样的功能。但我相信我们需要这样做,以避免吓跑人们并提供更多有用的信息。有了这样的工具,希望智能框架和库不会成为遗书。

2022-03-01