我认为每种语言都是为特定目的而创建的。 Scala创建的是什么以及最好解决哪些问题?
答案 0 :(得分:16)
Scala talks by Martin Odersky中提到的一个问题是它是一种可以很好地解决各种问题的语言。他并不是在谈论性能意义上的扩展,而是从语言本身可以看起来通过库扩展。那样:
val lock = new ReentrantReadWriteLock
lock withReadLock {
//do stuff
}
看起来有一些特殊的语法糖来处理j.u.c
锁。但事实并非如此,它只是以出现的方式使用scala语言。代码更具可读性,不是吗?
特别是scala语言的各种解析规则使得创建看起来像域特定语言(或DSL)的库变得非常容易。以scala-test为例:
describe("MyCoolClass") {
it("should do cool stuff") {
val c = new MyCoolClass
c.prop should be ("cool")
}
}
(还有更多的例子 - 昨天我发现了this one。有很多关于JDK7(project coin)中Java语言的新功能的讨论。其中许多功能都是处理某些特定问题的特殊语法糖。 Scala的设计有一些简单的规则,这意味着不需要为每一点烦恼提供新的关键字。
答案 1 :(得分:13)
Scala的另一个目标是弥合功能和面向对象的语言之间的差距。它包含许多受启发(即复制自!)功能语言的结构。我是强大的pattern-matching,actor-based concurrency framework和(当然)一阶和更高阶函数。
当然,你的问题是说有一个特定目的,我刚刚给出了3个不同的理由;你可能不得不问Martin Odersky!
答案 2 :(得分:7)
最初的设计目标之一当然是创建一种在Java虚拟机上运行并且与Java类完全互操作的语言。这有(至少)两个好处:
答案 3 :(得分:7)
同意之前的回答,但建议使用An Overview of the Scala Programming Language简介:
Scala的工作源于为组件软件开发更好的语言支持的研究工作。我们希望通过Scala实验验证两个假设。首先,我们假设组件软件的编程语言需要是可扩展的,因为相同的概念可以描述小部件和大部件。因此,我们专注于抽象,组合和分解的机制,而不是添加一大组原语,这些原语可能对某些规模级别的组件有用,但不适用于其他级别。其次,我们假设可以通过编程语言提供对组件的可扩展支持,该编程语言统一并概括了面向对象和函数编程。对于静态类型语言,其中Scala是一个实例,这两种范例到目前为止基本上是分开的。 (Odersky的)
我个人将Scala与Python一起分类,解决了它解决的问题以及解决方法。明显的差异和偶尔的抱怨是类型复杂性。我同意Scala的抽象是复杂的,有时看似令人费解,但有几点:
例如,String(或者更确切地说:它的支持类RichString)可以看作是Chars序列,但它不是通用的集合类型。然而,通过RichString将字符映射到字符映射应该再次产生RichString,如下面与Scala REPL的交互:
scala> "abc" map (x => (x + 1).toChar)
res1: scala.runtime.RichString = bcd
但是如果将Char中的函数应用到字符串中会发生什么?在这种情况下,我们不能生成一个字符串作为结果,它必须是一些Int元素序列。确实有人得到:
"abc" map (x => (x + 1))
res2: scala.collection.immutable.Vector[Int] = Vector(98, 99, 100)
事实证明,map会产生不同的类型,具体取决于传递的函数参数的结果类型! (Odersky的)
答案 4 :(得分:2)
因为它是功能性的并且使用了actor(据我所知,如果我错了就请评论)它可以很容易地扩展到几乎任何数量的CPU。
那就是说,我认为Scala是新语言功能的试验台。扔进厨房的水槽,看看会发生什么。
我个人的观点是,对于任何涉及3人以上团队的应用程序而言,使用非常简单和限制性语法的语言会更有效率,因为整个工作变得更像是与其他人交互的方式而不仅仅是编码到让电脑做点什么。
您添加的人越多,您花在解释内容上的时间就越多?:意味着或者之间的区别和||适用于两个布尔值(在Java中,你会发现很少有人知道)。