代码之家  ›  专栏  ›  技术社区  ›  Don Werve

斯卡拉有什么了不起的?[关闭]

  •  31
  • Don Werve  · 技术社区  · 17 年前

    是什么让scala成为如此出色的语言, 其他 比打字系统?我读到的关于这门语言的几乎每一篇文章都把“强类型”作为使用scala的一个重要原因,但必须有更多的理由。还有哪些引人注目和/或很酷的语言特性使scala成为一个非常有用的工具?

    14 回复  |  直到 14 年前
        1
  •  33
  •   andri    17 年前

    下面是一些让我喜欢斯卡拉的东西(比如,通常的Java):

    a)类型推断。Java的方式:

    Map<Something, List<SomethingElse>> list = new HashMap<Something, List<SomethingElse>>()
    

    …与scala相比是相当冗长的。如果您给出这些列表中的一个,编译器应该能够找出它。

    b)一阶函数。同样,这个功能可以用类来模拟,但是它很难看。

    c)具有 map fold . 这两个并列(b),而且这两个是我希望每一次我必须编写Java。

    d)模式匹配和案例类。

    e)方差,这意味着如果 S extends T 然后 List[S] extends List[T] 也。

    再加上一些静态类型的good,我在语言上的销售速度相当快。

        2
  •  24
  •   Michael    17 年前

    这是一群语言中最好的部分的混合,什么是不值得爱的:

    • ruby简洁的语法
    • Java的性能
    • Erlang的演员支持
    • 闭包/块
    • 方便的地图和阵列速记
        3
  •  22
  •   Kevin Wright    15 年前

    scala经常被标榜为拥有闭包和隐式。这并不奇怪,因为缺少闭包和显式类型可能是Java示例文件的两大来源!

    但是,一旦你深入研究它,它就远远超出Java而没有恼人的比特,也许Scala最大的力量不是一个特定的命名特征,而是统一其他答案中提到的所有特征的成功。

    职务后

    面向对象和函数编程的结合例如:由于函数是对象,scala能够使map s实现函数接口,因此当使用map查找值时,语法上与使用函数计算值没有区别。在很好地统一这些范例的过程中,scala确实是一种后功能语言。

    或者操作符重载,这是通过没有操作符来实现的,它们只是中缀符号中使用的方法。所以 1 + 2 只是打电话给 + 方法。如果方法名为 plus 相反,你会把它当作 1 plus 2 这和 1.plus(2) . 这是因为功能的另一个组合;scala中的所有内容都是一个对象,没有原语,因此整数可以有方法。

    其他特征融合

    还提到了类型类,它是由更高类型、单例对象和隐式的组合实现的。

    协同工作的其他特性是case类和模式匹配,允许您轻松地构建和解构代数数据类型,而不必手动编写Java所要求的所有繁琐的相等、哈希代码、构造函数和吸收器/ SETER逻辑。

    默认情况下,指定不变性、提供惰性值和提供第一类函数,这些都结合在一起,为您提供了一种非常适合构建高效函数数据结构的语言。

    这个列表还在继续,但是我已经使用scala超过3年了,而且我几乎每天都会惊讶于所有的东西是如何一起工作的。

    高效多功能

    scala也是一种小型语言,其规范(令人惊讶!)只需要大约1/3的Java大小。这部分是因为Java在SCAA中有很多特殊的例子,Scala简化了,部分原因是移除了诸如图元和运算符之类的特征,部分原因是许多功能已经从语言迁移到T。他在图书馆。

    因此,scala库作者可以使用的所有技术对任何scala用户都是可用的,这使得它成为定义自己的控制流结构和构建dsl的好语言。这在像Akka这样的第三方演员框架项目中已经得到了很好的应用。

    深的

    最后,它扩展了所有编程风格。

    运行时解释器(称为repl)允许您在交互式会话中非常快速地探索想法,scala文件也可以作为脚本运行,而无需显式编译。当与类型推断结合使用时,这给scala一种动态语言的感觉,比如ruby、perl或bash脚本。

    另一方面,traits、类、对象和self类型允许您构建一个基于不同组件和使用依赖注入的全面企业系统,而无需第三方工具。Scala还与Java库集成在一个几乎与本地Java相当的级别上,通过在JVM上运行可以充分利用该平台上提供的所有速度优势,以及在Tomcat或OSGi等容器中完全可用。

        4
  •  15
  •   Kevin Peterson    15 年前

    我刚来斯卡拉,但我的印象是:

    真正好的jvm集成将是驱动因素。JRube可以调用Java,Java可以调用JRuBy代码,但是它明确地调用了另一种语言,而不是Scala Java的干净集成。因此,您可以使用Java库,甚至在同一个项目中混合和匹配。

    当我意识到驱动下一个伟大语言的东西是容易并发时,我开始关注scala。从性能角度看,jvm具有良好的并发性。我相信有人会说erlang更好,但是scala实际上对于普通程序员来说是可用的。

    Java掉下来的原因是它太冗长了。创建和传递函子需要的字符太多。scala允许将函数作为参数传递。

    在Java中创建联盟类型或应用接口到现有类是不可能的。这两个在斯卡拉都很容易。

    静态类型通常会对冗长性造成很大的影响。scala消除了这一缺点,同时仍然提供了静态类型的优点,即编译时类型检查,它使代码辅助编辑器变得更容易。

    扩展语言的能力。数十年来,这一直是Lisp的动力所在,这也使得RubyonRails得以发展。

        5
  •  10
  •   Apocalisp    14 年前

    类型系统实际上是scala最显著的特性。它也有很多语法上的便利,比如说Java。

    但对我来说,scala最引人注目的特性是:

    实际上,这些特性使您可以近似(并在某些方面超过)haskell的 type classes . 结合起来,它们可以让您编写非常模块化的代码。

        6
  •  6
  •   thSoft    17 年前

    很快:

    • 您可以获得Java库的权限和平台独立性,但没有样板和冗长。
    • 您可以获得ruby的简单性和生产力,但是需要使用静态类型和编译的字节码。
    • 您得到了haskell的功能良好性和并发性支持,但是没有完全的范式转换,也没有面向对象的好处。

    我觉得它所有的壮丽特征都特别吸引人,尤其是:

    • 大多数在Java中需要加载样板代码的面向对象设计模式都是本地支持的,例如Singleton(通过对象)、适配器、装饰器(通过特征和暗示)、访问者(通过模式匹配)、策略(通过闭包)等。
    • 您可以非常简洁地定义域模型和dsl,然后您可以使用必要的特性(通知、关联处理、解析、序列化)扩展它们,而无需生成代码或框架。
    • 最后,与支持良好的Java平台有充分的互操作性。可以在两个方向上混合Java和Scala。当遇到Java的烦恼,代码难以维护时,切换到Scala时没有太多的惩罚和兼容性问题。
        8
  •  4
  •   Chase Seibert    17 年前

    据说让scala代码运行起来很容易 concurrently 在多个处理器上。

        9
  •  4
  •   oxbow_lakes    17 年前

    控制流的表现力。例如,有一个需要以某种方式处理的数据集合是非常常见的。这可能是一个交易列表,其中的处理包括按某些属性(投资工具的货币)分组,然后进行求和(可能得到每种货币的总数)。

    在爪哇中,这包括分离出一段代码来完成分组(循环的几行),然后另一段代码来完成求和(另一个循环)。在scala中,这类事情通常可以在使用函数式编程的一行代码中实现,然后是折叠(folding)。

    当然,这只是一个关于Java的函数语言的论证。

        10
  •  4
  •   John Nilsson    15 年前

    scala的伟大特性已经被提到。不过,有一件事是贯穿过去所有功能的,那就是所有功能的整合是多么的雅致。

    scala成功地成为了最强大的语言之一,而没有一种匆匆忙忙地附加功能的感觉。语言也不是证明一个观点的学术练习。创新和真正先进的概念被引入到语言中,具有不可思议的实用性和优雅性。

    简而言之:马丁·奥德斯基是一个纯粹的设计天才。这就是斯卡拉的伟大之处!

        11
  •  3
  •   GClaramunt    17 年前

    我想添加多范型(oo和fp)特性,这使scala比其他语言更具优势

        12
  •  3
  •   Bryan Hunt    15 年前

    每天你编写Java代码,你会变得越来越痛苦,每天你对Scala进行编码,你会变得更快乐。

        13
  •  1
  •   Community Mohan Dere    9 年前

    以下是一些对函数式语言吸引力的相当深入的解释。

    How/why do functional languages (specifically Erlang) scale well?

        14
  •  1
  •   Alexey    16 年前

    如果我们放弃对特性的讨论,转而讨论样式,我会说这是流水线式的编码。从某个对象或集合开始,键入dot and property或dot and transformation,直到形成所需的结果。这样就很容易写出一系列易读的信息。在某种程度上,traits还允许您应用相同的方法来构造类型。

    推荐文章