我刚刚开始研究即将发布的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,你会担心吗?您是否计划立即采用2.8版本,还是等待结果?
Steve Yegge曾攻击Scala(在我看来是错误的),因为他认为Scala的类型系统过于复杂。我担心有人会用这个API来传播FUD(类似于Josh Bloch如何吓得JCP不敢向Java添加闭包)。
注意-我应该清楚,虽然我认为约书亚·布洛赫在拒绝BGGA关闭提案方面有影响力,但我不认为这是因为他诚实地认为该提案代表了错误。
尽管我的妻子和同事一直在告诉我,我并不认为自己是个白痴:我在牛津大学获得了很好的数学学位,我已经在商业编程近12年,在Scala编程大约一年(也是商业编程)。
请注意,煽动性主题标题引用了20世纪80年代初英国一个政党的宣言。这个问题是主观的,但这是一个真实的问题,我已经把它改成了CW,我想就此事发表一些意见。
嗯,我可以理解你的痛苦,但坦率地说,像你和我这样的人——或者几乎任何一个普通的StackOverflow用户——都不是规则。
我的意思是。。。大多数程序员都不会在意类型签名,因为他们永远不会看到它们!他们不阅读文档。
只要他们看到了代码如何工作的一些示例,并且代码不会使他们无法产生他们期望的结果,他们就永远不会查看文档。当失败时,他们将查看文档并期望在顶部看到用法示例。
考虑到这些,我认为:
任何人(像大多数人一样)遇到这种类型签名时,如果事先对Scala进行了处理,就会对其进行无限的嘲笑,如果他们喜欢Scala,就会认为它是Scala力量的象征。如果文档没有得到增强以提供使用示例,并清楚地解释方法的用途和使用方法,那么可能会有点影响Scala的采用。从长远来看,这无关紧要。Scala可以做这样的事情,这将使为Scala编写的库更加强大,使用起来更加安全。这些库和框架将吸引熟悉强大工具的程序员。喜欢简单和直接的程序员将继续使用PHP或类似的语言。
唉,Java程序员非常热衷于强大的工具,所以,在回答这个问题时,我刚刚修正了我对主流Scala采用的期望。我毫不怀疑Scala会成为主流语言。不是C主流,但可能是Perl主流或PHP主流。
说到Java,您曾经替换过类加载器吗?你有没有调查过这涉及到什么?如果你看看框架编写者所做的事情,Java可能会很可怕。只是大多数人都不知道。这同样适用于Scala,IMHO,但早期采用者倾向于在他们遇到的每一块岩石下寻找,看看是否有什么隐藏在那里。
嗯,我可以理解你的痛苦,但坦率地说,像你和我这样的人——或者几乎任何一个普通的StackOverflow用户——都不是规则。
我的意思是。。。大多数程序员都不会在意类型签名,因为他们永远不会看到它们!他们不阅读文档。
只要他们看到了代码如何工作的一些示例,并且代码不会使他们无法产生他们期望的结果,他们就永远不会查看文档。当失败时,他们将查看文档并期望在顶部看到用法示例。
考虑到这些,我认为:
任何人(像大多数人一样)遇到这种类型签名时,如果事先对Scala进行了处理,就会对其进行无限的嘲笑,如果他们喜欢Scala,就会认为它是Scala力量的象征。如果文档没有得到增强以提供使用示例,并清楚地解释方法的用途和使用方法,那么可能会有点影响Scala的采用。从长远来看,这无关紧要。Scala可以做这样的事情,这将使为Scala编写的库更加强大,使用起来更加安全。这些库和框架将吸引熟悉强大工具的程序员。喜欢简单和直接的程序员将继续使用PHP或类似的语言。
唉,Java程序员非常热衷于强大的工具,所以,在回答这个问题时,我刚刚修正了我对主流Scala采用的期望。我毫不怀疑Scala会成为主流语言。不是C主流,但可能是Perl主流或PHP主流。
说到Java,您曾经替换过类加载器吗?你有没有调查过这涉及到什么?如果你看看框架编写者所做的事情,Java可能会很可怕。只是大多数人都不知道。这同样适用于Scala,IMHO,但早期采用者倾向于在他们遇到的每一块岩石下寻找,看看是否有什么隐藏在那里。
我拥有一所廉价的“大众市场”美国大学的本科学位,所以我可以说我处于用户智能(或至少是教育)的中等水平:)我涉足Scala仅几个月,并开发了两三个非平凡的应用程序。
特别是现在IntelliJ发布了他们的优秀IDE,IMHO是目前最好的Scala插件,Scala开发相对轻松:
我发现我可以使用Scala作为一个“没有分号的Java”,也就是说,我编写的代码与我在Java中所做的代码相似,并且从语法简洁(比如通过类型推断获得的简洁)中获益匪浅。异常处理,当我做的时候,更方便。没有getter/setter样板,类定义就不那么冗长了。偶尔我会写一行代码,以实现相当于多行Java代码的功能。在适用的情况下,诸如map、fold、collect、filter等功能方法链的组成既有趣又美观。我很少能从Scala更强大的功能中获益:闭包和部分(或curried)函数、模式匹配。。。那种事。
作为一个新手,我继续努力学习简洁和惯用的语法。没有参数的方法调用不需要括号,除非它们需要括号;match语句中的case需要一个粗箭头(=>),但也有一些地方需要一个细箭头(->)。许多方法都有简短但相当隐晦的名称,如/:或\:-如果我翻了足够多的手册页,我可以完成我的工作,但我的一些代码看起来像Perl或行噪声。具有讽刺意味的是,最流行的语法速记之一在实际操作中缺失了:我一直被Int没有定义++方法这一事实所困扰。
这只是我的看法:我觉得Scala具有C++的强大功能,同时又具有C++的复杂性和可读性。语言的语法复杂性也使得API文档难以阅读。
Scala在很多方面都是经过深思熟虑的。我想很多学者都会喜欢用它编程。然而,它也充满了智慧和陷阱,它比Java有更高的学习曲线,更难阅读。如果我浏览论坛,看到有多少开发人员仍在为Java的精细之处而挣扎,我无法想象Scala会成为主流语言。没有一家公司能够证明派遣开发人员参加为期3周的Scala课程是合理的,因为他们以前只需要一周的Java课程。
我希望这不是“遗书”,但我明白你的意思。您发现了Scala的优点和问题:它的可扩展性。这使我们能够实现库中的大多数主要功能。在其他一些语言中,带有map或collect之类的序列将被内置,没有人需要了解编译器要使其顺利工作所需的所有步骤。在Scala中,它都在一个库中,因此是公开的。
事实上,复杂类型支持的地图功能非常先进。考虑一下:
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,则会再次获得一个BitSet,但如果将Int映射到Strings,则将获得一个通用Set。映射结果的静态类型和运行时表示都取决于传递给它的函数的结果类型。即使集合为空,这也有效,因此函数永远不会被应用!据我所知,没有其他集合框架具有同等功能。然而,从用户的角度来看,这就是事情应该如何工作的。
我们面临的问题是,所有实现这一点的巧妙技术都会泄露到类型签名中,而这些签名变得又大又吓人。但也许默认情况下不应该向用户显示地图的完整类型签名?如果她在BitSet中查找地图,她会得到:
map(f: Int => Int): BitSet (click here for more general type)
在这种情况下,文档不会说谎,因为从用户的角度来看,map确实具有类型(Int=>Int)=>BitSet。但地图也有一个更通用的类型,可以通过单击另一个链接来查看。
我们还没有在工具中实现这样的功能。但我认为我们需要这样做,以避免吓跑人们,并提供更多有用的信息。有了这样的工具,希望智能框架和库不会成为自杀笔记。