我刚刚开始研究即将发布的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,我想就此事发表一些意见。


当前回答

似乎有必要在这里注明自己的学位:政治学学士和计算机科学学士。

说到点子上:

这会让人们不去斯卡拉吗?

Scala很难,因为它的底层编程范式很难。函数式编程让很多人害怕。在PHP中构建闭包是可能的,但人们很少这样做。因此,如果人们没有特定的教育来让他们重视底层范式的力量,那么不,不是这个签名,而是其他所有签名都会让人们望而却步。

如果这种教育是可行的,每个人都可以做到。去年我在SCALA和一群学生一起制作了一台国际象棋电脑!他们有自己的问题,但最终还是做得很好。

如果你在商业上使用Scala,你会担心吗?您是否计划立即采用2.8版本,还是等待结果?

我不会担心的。

其他回答

C++中的相同内容:

template <template <class, class> class C,
          class T,
          class A,
          class T_return,
          class T_arg
              >
C<T_return, typename A::rebind<T_return>::other>
map(C<T, A> &c,T_return(*func)(T_arg) )
{
    C<T_return, typename A::rebind<T_return>::other> res;
    for ( C<T,A>::iterator it=c.begin() ; it != c.end(); it++ ){
        res.push_back(func(*it));
    }
    return res;
}

我拥有一所廉价的“大众市场”美国大学的本科学位,所以我可以说我处于用户智能(或至少是教育)的中等水平:)我涉足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(1 -> "a", 2 -> "b").map((t) => (t._2) -> (t._1)) // returns Map("a" -> 1, "b" -> 2)
Map(1 -> "a", 2 -> "b").map((t) =>  t._2)            // returns List("a", "b")

多态性做得很好。

当然,这不是一种主流范式,它会吓跑很多人。但是,它也会吸引许多看重其表现力和优雅的人。

使用站点中的错误消息如何?

当出现需要将现有类型与适合DSL的自定义类型集成的用例时,情况又会如何呢。一个人必须在关联、优先级、隐式转换、隐式参数、更高级的类型,以及可能存在的类型方面受过良好的教育。

很高兴知道,大多数情况下,这很简单,但并不一定足够。如果要设计广泛的图书馆,至少必须有一个人知道这些东西。

似乎有必要在这里注明自己的学位:政治学学士和计算机科学学士。

说到点子上:

这会让人们不去斯卡拉吗?

Scala很难,因为它的底层编程范式很难。函数式编程让很多人害怕。在PHP中构建闭包是可能的,但人们很少这样做。因此,如果人们没有特定的教育来让他们重视底层范式的力量,那么不,不是这个签名,而是其他所有签名都会让人们望而却步。

如果这种教育是可行的,每个人都可以做到。去年我在SCALA和一群学生一起制作了一台国际象棋电脑!他们有自己的问题,但最终还是做得很好。

如果你在商业上使用Scala,你会担心吗?您是否计划立即采用2.8版本,还是等待结果?

我不会担心的。