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


当前回答

我完全同意这个问题和马丁的回答:)。即使在Java中,由于额外的噪声,使用泛型读取javadoc也比应该的要困难得多。这在Scala中是复杂的,其中隐式参数被用作问题的示例代码(而隐式参数做了非常有用的集合变形)。

我不认为这是语言本身的问题——我认为这更多是工具问题。虽然我同意Jörg W Mittag所说的,但我认为查看scaladoc(或IDE中某一类型的文档)应该需要尽可能少的脑力来探索方法是什么、它需要什么和它的回报。不需要在一张纸上拼凑出一点代数就可以了:)

当然,IDE需要一种很好的方式来显示任何变量/表达式/类型的所有方法(就像Martin的例子一样,可以内联所有泛型,这样很好,也很容易找到)。我也喜欢马丁默认隐藏隐式的想法。

以scaladoc为例。。。

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That

当在scaladoc中看到这个时,我希望默认情况下隐藏通用块[B,That]以及隐式参数(如果你用鼠标悬停一个小图标,它们可能会显示)-作为阅读它的额外内容,这通常并不相关。例如,想象一下这看起来像。。。

def map(f: A => B): That

很好,很清楚,很明显。你可能想知道“那”是什么,如果你将鼠标放在上面或单击它,它可以展开[B,That]文本,突出显示“那”。

也许一个小图标可以用于[]声明和(隐式…)块,所以很明显,语句中有一些小部分被折叠了?很难使用令牌,但我会使用。目前。。。

def map.(f: A => B).: That

因此,默认情况下,类型系统的“噪音”被隐藏在人们需要查看的80%的主要内容中-方法名称、参数类型和返回类型,非常简单简洁-如果你真的非常关心,那么就很少有可扩展的链接来查看细节。

大多数人都在阅读scaladoc,以了解他们可以对类型调用什么方法以及可以传递什么参数。

这是另一个例子。。。

def orElse[A1 <: A, B1 >: B](that: PartialFunction[A1, B1]): PartialFunction[A1, B1]

现在,如果我们隐藏泛型声明,则更容易阅读

def orElse(that: PartialFunction[A1, B1]): PartialFunction[A1, B1]

然后,如果人们将注意力停留在A1上,比如说,我们可以显示A1声明为A1<:A。泛型中的协变和逆变类型也会增加大量噪声,我认为这可以以更容易理解的方式呈现给用户。

其他回答

我完全同意这个问题和马丁的回答:)。即使在Java中,由于额外的噪声,使用泛型读取javadoc也比应该的要困难得多。这在Scala中是复杂的,其中隐式参数被用作问题的示例代码(而隐式参数做了非常有用的集合变形)。

我不认为这是语言本身的问题——我认为这更多是工具问题。虽然我同意Jörg W Mittag所说的,但我认为查看scaladoc(或IDE中某一类型的文档)应该需要尽可能少的脑力来探索方法是什么、它需要什么和它的回报。不需要在一张纸上拼凑出一点代数就可以了:)

当然,IDE需要一种很好的方式来显示任何变量/表达式/类型的所有方法(就像Martin的例子一样,可以内联所有泛型,这样很好,也很容易找到)。我也喜欢马丁默认隐藏隐式的想法。

以scaladoc为例。。。

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That

当在scaladoc中看到这个时,我希望默认情况下隐藏通用块[B,That]以及隐式参数(如果你用鼠标悬停一个小图标,它们可能会显示)-作为阅读它的额外内容,这通常并不相关。例如,想象一下这看起来像。。。

def map(f: A => B): That

很好,很清楚,很明显。你可能想知道“那”是什么,如果你将鼠标放在上面或单击它,它可以展开[B,That]文本,突出显示“那”。

也许一个小图标可以用于[]声明和(隐式…)块,所以很明显,语句中有一些小部分被折叠了?很难使用令牌,但我会使用。目前。。。

def map.(f: A => B).: That

因此,默认情况下,类型系统的“噪音”被隐藏在人们需要查看的80%的主要内容中-方法名称、参数类型和返回类型,非常简单简洁-如果你真的非常关心,那么就很少有可扩展的链接来查看细节。

大多数人都在阅读scaladoc,以了解他们可以对类型调用什么方法以及可以传递什么参数。

这是另一个例子。。。

def orElse[A1 <: A, B1 >: B](that: PartialFunction[A1, B1]): PartialFunction[A1, B1]

现在,如果我们隐藏泛型声明,则更容易阅读

def orElse(that: PartialFunction[A1, B1]): PartialFunction[A1, B1]

然后,如果人们将注意力停留在A1上,比如说,我们可以显示A1声明为A1<:A。泛型中的协变和逆变类型也会增加大量噪声,我认为这可以以更容易理解的方式呈现给用户。

我也有牛津大学的数学学位!我花了一段时间才“拿到”新藏品。但我现在非常喜欢它。事实上,“map”的键入是2.7中最早让我感到困扰的事情之一(也许是因为我做的第一件事是集合类的子类之一)。

阅读Martin关于新的2.8集合的论文确实有助于解释隐式的用法,但是的,文档本身肯定需要更好地解释不同类型的隐式在核心API的方法签名中的作用。

我最担心的是:2.8将于何时发布?bug报告什么时候停止出现?scala团队是不是用2.8咬得太多了/试图一下子改变太多了?

我真的很希望在添加任何其他新功能之前,将2.8稳定发布作为一个优先事项,并想知道(在观望的同时)是否可以对scala编译器的开发路线图进行一些改进。

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社区可以帮助减轻新手程序员对Scala的恐惧,其中一个方法就是专注于实践,并通过实例进行教学——很多实例都是从小开始,逐渐长大的。以下是一些采用这种方法的网站:

每日Scala学习Scala简单Scala

在这些网站上花了一段时间后,人们很快意识到Scala及其库虽然可能很难设计和实现,但使用起来并不那么困难,特别是在常见情况下。

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

说到点子上:

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

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

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

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

我不会担心的。