为什么Scala非常复杂?

Ana*_*ran 16 java scala

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

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

cod*_*eon 37

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

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

  1. 这是必要的
  2. 它是面向对象的
  3. 这是垃圾收集

功能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并不难以学习,功能编程范例是大多数开发人员的原因,他们只是接触过命令式语言,难以加快速度.

  • 我希望我的大学应该教授Scheme而不是J2EE. (11认同)
  • 我不认为一个大学专注于当前的*工作人员的语言* - 阅读:Java和C# - 一点也不好.无论我们有多少人都喜欢用任何其他语言表达爱好,强制性的OO和GC语言的成功表明,尽管存在缺点,但很多人都对他们说不错.值得庆幸的是,它并不像Java那样可能会让C#静止不动.另外:两种语言都有一个充满活力的生态系统,这非常重要.学院应该教授更多的语言,并在课程中提供强制性的编译和/或语言设计讲座. (3认同)

Ita*_*man 13

这里有两个问题:

  1. 学习Scala比Java更难吗?
  2. 用Scala编写的代码是否比用Java编写的代码更复杂?

第一个问题更容易回答:Scala语言比Java更丰富.特别是,它的类型系统比Java更具表现力,这意味着可以将更多的逻辑错误表达为编译时错误.但是,为了利用这些功能,需要熟悉语言的不同构造(依赖类型,案例类,方差注释,视图等等).掌握这些需要时间,这就是为什么Scala比Java更复杂.

第二个问题比较棘手.Scala主张声称这些新结构使编写正确的程序变得更容易,并且生成的代码更简单.其他人则认为Scala的额外功能并不会超过理解其构造的语义的复杂性(例如,看一下这个话题.搜索"Scala").这是更广泛争议的表现:静态与动态类型语言的争议.

  • 我认为使用"依赖类型"来表示"路径依赖类型"会让大多数人感到困惑(至少对我来说是这样). (7认同)
  • 第一个问题的答案已经过时了.可以认为它类似于理解任何中型代码中隐藏的不变量.一个非常简单的类比是Java 1.4,您必须使用注释并对代码进行爬网,以便了解可以将哪些类型的元素插入到集合中.Java 1.5相当复杂,但如果使用得当,可以使代码更加健壮. (2认同)

Edw*_*uck 8

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

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

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

  • 每个范例都提供"足够"的绳索.挂起自己的方式各不相同. (6认同)

Jes*_*sse 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
**
Run Code Online (Sandbox Code Playgroud)


Syn*_*sso 7

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

或者你可能正在发现使用更高阶函数复杂的范式转换.

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


Dan*_*ral 7

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

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

  • 我同意.当你想写简单的东西时,Scala很简单.对于"斯卡拉的对立面"来说,C可能是一个完美的典型代表 - 当你想要编写简单的东西时,它很复杂,让你不知道在`const`前面的&符号和`const'之后的&符号之间的区别. . (5认同)

Don*_*zie 6

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

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


Itt*_*ayD 5

Scala很复杂有几个原因:

它带来了函数式编程范例.由于这些原因,Scala Collection库远远超过了Java.

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

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

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

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