我是学生。我在第二年学习了java。现在我是第四年。我厌倦了 java和我开始学习Scala。当我学习它时,我发现它非常复杂(尽管我喜欢它)。我的问题可能适用于所有新的复杂语言。
为什么scala很复杂?
是因为我们需要创建复杂的软件吗?
或者我是唯一一个认为它很复杂的人?
答案 0 :(得分:36)
答案 1 :(得分:13)
这里有两个问题:
第一个问题更容易回答:Scala语言比Java更丰富。特别是,它的类型系统比Java更具表现力,这意味着可以将更多的逻辑错误表达为编译时错误。但是,为了利用这些功能,需要熟悉语言的不同构造(依赖类型,案例类,方差注释,视图等等)。掌握这些需要时间,这就是Scala比Java更复杂的原因。
第二个问题比较棘手。 Scala主张声称这些新结构使编写正确的程序变得更容易,并且生成的代码更简单。其他人则说Scala的额外功能并不比理解其构造的语义更复杂(例如,看看这个talk。搜索“Scala”)。这是更广泛争议的表现:静态与动态类型语言的争论。
答案 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相同的功能。
爪哇:
答案 13 :(得分:0)
Stack Overflow上最受欢迎的Scala问题之一就是complexity of the Scala 2.8 libraries。我建议你看看。
答案 14 :(得分:0)
如上所述,Scala之所以如此复杂,是因为它的类型系统。这是一个令人印象深刻的工程,但即使是专家Scala程序员也会被它绊倒。我强烈建议任何考虑学习和使用Scala的人都要先仔细看看Clojure。它提供了Scala的所有功能和优点,而不必持续不得不与类型系统作斗争。