为什么Scala非常复杂?

时间:2010-04-04 08:18:49

标签: java scala

我是学生。我在第二年学习了java。现在我是第四年。我厌倦了 java和我开始学习Scala。当我学习它时,我发现它非常复杂(尽管我喜欢它)。我的问题可能适用于所有新的复杂语言。

为什么scala很复杂?
是因为我们需要创建复杂的软件吗? 或者我是唯一一个认为它很复杂的人?

15 个答案:

答案 0 :(得分:36)

@Anantha在过去的十年里,大多数大学一直在教他们的学生Java作为第一语言。我听说过很多案例,它甚至仍然是学生在大学时学习的唯一语言 - 除非他们自己拿起别的东西,就是这样。

纯粹从语言角度来看,Java的三个最具特色的功能是

  1. 这是必要的
  2. 它是面向对象的
  3. 收集垃圾
  4. 特色1& 2使它与Algol / C和C ++系列中的各种语言非常相似。所有这些语言在其范例中都有相似之处,甚至使用完全相同的语言。

    例如,C#,尽管它有语法差异,Windows作为主要目标操作系统,.NET框架作为“类库”,很容易为Java程序员选择。这是因为两种语言共享相同的编程范例。

    另一方面,Scala - 尽管在JVM上运行,提供与Java API的轻松互操作性 - 通常被称为多范式语言。该语言提供了函数式编程语言特性的深层语法集成,并以面向对象的方式构造代码。

    函数式编程的概念 - 特别是一旦你进入琐碎的教程之外的代码 - 证明对那些只有必要的OO语言经验的开发人员来说很难。我帮助开发人员快速掌握Scala等人的个人经验是,首先教他们Scheme很有帮助;)这是一个很好的,小巧,干净的Lisp方言。它有助于传达先进的功能概念。如果你决定试一试,我建议你看一下“The Little Schemer”和“The Seasoned Schemer”。一旦你完成了这两本书,我敢打赌你可以更轻松地查看Scala的语法并更清楚地看到它的概念。

    简而言之:恕我直言,Scala不是 hard 学习,函数式编程范式是大多数开发人员的理由,他们只是暴露在命令之下语言,很难加快速度。

答案 1 :(得分:13)

答案 2 :(得分:8)

Scala非常复杂,因为它为您提供了灵活性。一次又一次,没有足够的灵活性使得很难完成一些任务,但太多的灵活性就像是太多的钱,它使你能够犯下真正的重大错误。

Scala既是面向对象又是功能。这两种语言类型曾经被认为是相当复杂的(尽管面向对象现在更加主流),但将它们放在一起会打开各种新的大门。其中一些门看起来像是“完成任务”的捷径!其中一些门后面有狮子。功能性编程为您提供了完成工作,挂起自己,并将您的社区联系起来多年的绳索。你可以不用功能性编程语言来伤害自己。

成功Scala的关键是要认识到你应该是一个成功的面向对象程序员,一个成功的函数式程序员,然后学习如何将两者结合在一起,以达到你的目标。这是很多工作。也许在未来,人们会知道什么是学习Scala的“最佳”方法,但就目前而言,唯一已知的方法是在两种不同的编程方法中表现良好,并且善于将它们混合在一起。

答案 3 :(得分:8)

如果您认为语言很复杂,那么您可以考虑分阶段学习。

将Scala分解为不同部分的指南是许多人本能地和通常必然会做的,但本指南是由Martin(Scala的创建者)编写的,因此它有其独特的视角。 http://www.scala-lang.org/node/8610

请注意,大多数让人失望的构造都在图书馆设计师级别中。没有太多的CS grad-school概念,中级应用程序开发人员可以完成很多工作。

**
            Level A1: Beginning application programmer
                Java-like statements and expressions: standard operators, 
                     method calls, conditionals, loops, try/catch
                class, object, def, val, var, import, package
                Infix notation for method calls
                Simple closures
                Collections with map, filter, etc
                for-expressions

            Level A2: Intermediate application programmer

                Pattern matching
                Trait composition
                Recursion, in particular tail recursion
                XML literals

            Level A3: Expert application programmer

                Folds, i.e. methods such as foldLeft, foldRight
                Streams and other lazy data structures
                Actors
                Combinator parsers

            Level L1: Junior library designer

                Type parameters
                Traits
                Lazy vals
                Control abstraction, currying
                By-name parameters

            Level L2: Senior library designer

                Variance annotations
                Existential types (e.g., to interface with Java wildcards)
                Self type annotations and the cake pattern for dependency injection
                Structural types (aka static duck typing)
                Defining map/flatmap/withFilter for new kinds of for-expressions
                Extractors

            Level L3: Expert library designer

                Early initializers
                Abstract types
                Implicit definitions
                Higher-kinded types
**

答案 4 :(得分:7)

Scala的复杂之处在于类型系统。它非常灵活,但不幸的是在复杂类型签名中暴露了这种灵活性。

或者你可能正在寻找使用更高阶函数的范式转换。

无论哪种方式,我建议你坚持下去。它提供了一定程度的超越Java语言的能力,这是无法传递的。

答案 5 :(得分:7)

我是唯一一个认为它很复杂的人吗?你可以用它来编写复杂的东西。但替代方案是能够编写复杂的东西,这不完全是一种改进。但我发现语言本身很简单。

我认为你正在经历的是学习第二语言的震撼。你可能会发现C的指针算术非常复杂。

答案 6 :(得分:6)

我建议你不要把Scala视为复杂的,只是先进的。 Scala代表了传统命令式编程语言的各个方面的广泛且令人惊讶的连贯性进展,但是这些进步中的每一个都很容易被吸收和应用。试图同时采用太多Scala的改进可能会导致混乱和信心受损。

斯卡拉值得主流采用,但似乎受到它自身的醉人效应的影响。在如此丰富的环境中,尝试满足于应用小改进是非常困难的,但不要被推迟。

答案 7 :(得分:5)

Scala很复杂有几个原因:

它带来了函数式编程范例。由于这些原因,Scala Collection库比Java更容易实现。

它允许创建模块化和流畅的API。例如,在Scala中,方法#map是在TraversableLike(集合库中的一个根类)中实现的,其结果类型是最合适的具体集合的类型(对于BitSet,它将返回一个BitSet,如果映射将Int转换为Int,否则转换为Set。这可以通过语言实现,而不是编译器技巧。

它是静态类型的。创建具有上述功能的动态语言更容易,但静态类型为您提供IDE支持和性能。

恕我直言,所有这些功能都非常重要,值得额外的复杂性。

我曾经和你在一起。当我在2006年遇到Scala时,由于其复杂性,我在尝试学习它之后放弃了它。我必须为我正在做的项目学习它,我很高兴我这样做了。我认为2006年没有学到它是我职业生涯中最大的错误之一。

答案 8 :(得分:3)

它与Java(或任何现代编程语言)一样复杂 - 我只能假设您没有在Java中看到过大型程序。

它不仅仅是面向对象,还有功能,这是一种不同的编程范式。

不要将你的困难与功能编程混淆,语言很难。函数式编程对于那些习惯于面向对象(或程序)编程的人来说非常困惑。

答案 9 :(得分:3)

Scala提供了使库能够以非常简洁的方式使用的能力。 Java库通常具有冗长,繁琐的界面。这听起来只不过是斯卡拉的一个优点,但不一定。在Scala中,两个函数可以完全不同,但在使用中看起来非常相似 - 语法不是行为指南。而在Java中,某些事情总是通过语法变得明显。

假设您在Java中有一个函数foo,它的调用方式如下:

foo(v > 5);

所以我们显然传递了boolean值。没那么快!假设Java具有允许函数foo捕获表达式并稍后对其进行评估的功能(可能在不同的线程上)。因此,boolean不接受foo值,而是接受不带参数的函数并返回boolean。你只能通过查看呼叫站点就无法分辨出发生了什么。您必须知道foo如何工作的详细信息才能知道何时评估v > 5表达式。而在今天的Java中,表达式将始终在执行foo之前进行评估。

对于Java程序员来说,这可能看起来非常令人不安。但Scala有这个确切的功能。

这种语法和行为之间的联系的破坏使得Scala更容易混淆粗心大意。另一方面,它允许创建嵌入式域特定语言,其中重点是有一个适用于特定问题域的简洁,有效的符号。

答案 10 :(得分:3)

Java在强烈鼓励特定的写作风格方面具有独特性。如果您从两位专业程序员那里获取代码示例,那么Java可能是您可能无法区分它们的唯一语言。其中一个原因是Java相对缺乏灵活性,因此对于许多问题,只有一种方法可以做。

Scala更灵活,但这导致了许多方法来做同样的事情。例如,要从另一个Map填充Map,您可以迭代(Java,命令式样式),或者可以应用闭包(函数样式)。后者可能更紧凑,但如果你习惯于命令式语言则更加神秘。更糟糕的是,Scala有许多捷径可以使功能风格更加紧凑 - 专家可能更具可读性,但对非专家来说更加神秘。

换句话说,Scala是一种用于编写特定于域的语言的语言。它为您提供了为特定域添加关键字的工具。例如,您可以轻松地将Scala变成会计或粒子物理学的优秀语言。但是,会计师和物理学家将无法阅读彼此的节目。

不幸的是,一个这样的域名是集合。您可以编写Java样式的Map,Set和List代码。或者你可以使用一些更加神秘和简洁的更加神秘的代码 - 一旦你学会了所有的技巧。

我认为任何语言都不能兼得。

答案 11 :(得分:2)

我的孩子可以骑自行车,我的妈妈不能

我的妈妈可以开车,我的孩子不能

Scala不是复杂 - 不同

答案 12 :(得分:1)

我更复杂,因为它需要拥有它拥有的所有力量。 Java更简单,但Java也没有与Scala相同的功能。

爪哇:

  • +少学习
  • -closures
  • - 类型推断
  • -traits
  • -case statements

答案 13 :(得分:0)

Stack Overflow上最受欢迎的Scala问题之一就是complexity of the Scala 2.8 libraries。我建议你看看。

答案 14 :(得分:0)

如上所述,Scala之所以如此复杂,是因为它的类型系统。这是一个令人印象深刻的工程,但即使是专家Scala程序员也会被它绊倒。我强烈建议任何考虑学习和使用Scala的人都要先仔细看看Clojure。它提供了Scala的所有功能和优点,而不必持续不得不与类型系统作斗争。