这两天用scala写了一些程序,有一些体会。
scala作为一种函数式语言,特别适合将多个小的匿名函数串联起来,作用到一个列表对象(Option/Either/List/Map等)上。并且这么做会减少一些想临时变量名字的功夫,诱惑人不断把这种串联持续下去。比如:
val match = Option(fileName).map(new File(_)).map(Path(_).slurpString).map {str =>
val s = "^" + str + "$"
s.r.pattern
}.map.(_.matcher("hello world").matches).get
这种代码看起来很简短,但写起来和读起来其实都很费力,因为连续的小函数之间,都是隐藏起来的数据在流转。这些数据是什么类型,必须根据小函数的返回值来确定。而任何一个小函数的输入,都需要从前一个小函数的返回值获得。这样要看懂一句话的涵义,就必须从头开始,中间不能有任何中断,否则就无法知道下一步是怎么做的。
这种做法对于比较简短的一些操作非常有用,类似在shell中使用管道将几个非常熟练的命令行命令串联起来,看起来一目了然,非常清晰。但在编程语言中,由于过多的小括号甚至大括号,换行和断句,要看懂一句话是非常困难的。
当然,上述命令可以使用中缀表达式省去一些"."和小括号,看起来好看一些:
val match1 = Option(str) map (new File(_)) map (Path(_).slurpString) map {
str => ("^" + str + "$").r.pattern
} map {p => p matcher("hello world")}.matches.get
但这仍然不够。shell中,无论何时,我们知道管道间的输入输出,实际上只有一种类型的数据:字节流,所以我们无需费心想这个命令的输出和那个命令的输入分别是什么类型的,最后实际上我们都几乎忘了某个命令的输出类型,直接就使用其字面语义就直接明白命令串的涵义了。但scala中不同。首先列表都有好几种类型:Option,Either,List,Map,虽然每种的操作名字都是类似的,但就是因为这种类似性,在看一句语句的过程中,经常忘了这个到底是什么列表类型,需要到头上去看一下。
更可悲的是,有时候在脑海中相处某个匿名函数的返回值也比较困难。最可悲的是,经常遇到某些函数有几行,此时用大括号括起来,并且换行处理,就会变得比较痛苦。
所以,这种串联的确非常有意义,不过要变得有用,必须简短,一个原则就是:一行搞定,然后赋值给一个变量。如果有多行,就多加几个中间变量。这样做的好处很明显:人的思维深度是有限的,在某个地方就应该停一下,把中间思考结果记下来,然后继续思考。上面的代码应该可以这样写:
val rstr = Option(str) map {new File(_)} map {Path(_).slurpString}
val pattern = rstr map {str => ("^" + str + "$").r.pattern}
val result = pattern map {p => (p matcher "hello world").matches} get
看着清爽了不少。可以与java代码比较一下:
File file = new File(str);
String content = (new Path(file)).slurpString();
Pattern p = ("^" + str + "$").r().pattern();
boolean result = p.matcher("hello world").matches();
分享到:
相关推荐
Scala 是一门基于 Java 虚拟机(JVM)为目标运行环境,并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。Scala 是纯粹的面向对象语言,每个值都是对象,每个操作都是方法调用。 Scala 语言特点: ...
Scala是一门多范式编程语言,它将面向对象编程和函数式编程的特性结合在了一起。Scala运行在Java虚拟机(JVM)上,并能够无缝访问现有的Java类库,实现了与Java的互操作性。由于Scala拥有静态类型系统,编译器可以在...
《Scala编程》(Programming in Scala)是由Martin Odersky和Lex Spoon、Bill Venners三人合著的一本关于Scala语言的教材。本书被广泛认为是Scala学习的经典之作,提供了全面而详细的Scala语言介绍。书中从基础语法...
书中不仅涵盖了Scala语言的基础知识,也深入探讨了面向对象编程和函数式编程的原理和实践,这些都是Scala语言的核心特点。 评价者中包括有首席软件架构师和公司所有者,他们分享了自己的阅读体会,对这本书给予了...
所以,当你读完本书,做完习题后,虽然你的应用开发能力并不会直接提升,但你会体会到构建函数式语言和框架时的难点和取舍,从而增进你的框架开发和语言设计的能力。 ——ThoughtWorks Lead Consultant 杨博 这...
作为Scala的构建工具,SBT允许开发者利用Scala语言本身以及它的诸多特性来定义构建逻辑,使得Scala项目的构建过程更加符合Scala的编程范式。 根据提供的作者信息,Shiti Saxena 是一位具有约三年工作经验的软件...
**正文** ScalaCalculator是基于Scala编程语言开发的一个简易计算器项目,它的目标是为初学者提供一个实践...在这个过程中,你不仅会掌握Scala语言,还能体会到函数式编程的魅力,以及如何利用这些工具来解决问题。
而Scala作为一种多范式编程语言,以其强大的函数式编程特性和与Java的无缝集成,为构建高性能、可扩展的系统提供了便利。本文将深入探讨名为“srl”的Scala强化学习库,了解其设计理念、核心功能以及如何利用它进行...
Scala语言为Spark提供了简洁的API,使得编写分布式计算程序变得更加直观。结合sbt或maven,开发者可以高效地管理项目,进行单元测试,以及生成可以直接提交到集群运行的可执行JAR文件。 在实验过程中,学生会深入...
它支持多种编程语言,如Scala、Java和Python等,可以快速地处理批量数据和流式数据。 - **Hadoop**: Hadoop是另一个广泛使用的分布式计算框架,主要由HDFS(分布式文件系统)和MapReduce组成。Hadoop适用于处理大量非...
【Spark 初级编程实践】 Spark 是一个分布式计算框架,常用于大数据处理,它提供了高效的数据...同时,实验也强调了 Scala 作为 Spark 的主要编程语言,以及 sbt 和 spark-submit 在构建和部署 Spark 应用中的作用。
在不同语言的比较中,我体会到Lisp的简洁性和灵活性,ML的类型安全,Haskell的类型系统深度,以及Erlang在并发处理方面的优势。每个语言都有其独特的魅力和适用场景,理解它们的特性和优缺点对于拓宽编程视野非常...
而一些语言如Lisp,尽管在某些领域仍有影响力,但在商业应用中可能不如其他语言普及。 **二、上机实验心得体会** 1. **SML/NJ使用体验** - Standard ML of New Jersey (SML/NJ) 是一个强大的函数式编程环境,其...
Scala.js是Scala语言的一个编译器插件,它可以把Scala代码编译成JavaScript,使得我们可以在浏览器环境中运行Scala程序。 首先,我们需要了解Scala.js的基本概念。Scala.js允许开发者使用Scala语法编写前端代码,这...
- 人工智能和机器学习:函数式编程语言如Haskell和Scala被用于构建复杂的算法模型。 - 并行和分布式计算:函数式编程的无副作用和纯度使其在并行和分布式系统中能够更好地进行资源管理和错误控制。 2. 实验问题分析...
【函数式编程实验报告】 ...这些基础技能对于学习和理解其他函数式语言,如Haskell、Lisp或Scala等,都至关重要。通过实际操作,学生可以更好地掌握函数式编程的思维方式,提高代码的简洁性和可读性。
通常,这个环境包括硬件设备(如高性能服务器或云计算资源)、操作系统(如Linux或Windows)、大数据处理框架(如Hadoop、Spark)以及相关的编程语言和工具(如Java、Python、Scala和SQL)。在报告中,应详细描述所...
Intellij IDEA 是一款由 JetBrains 开发的功能强大的集成开发环境(IDE),主要用于 Java 应用程序的开发,同时也支持多种其他语言如 Kotlin、Groovy、Scala 等。它提供了丰富的功能,包括代码编写、调试、单元测试...
Spark提供了一个强大的计算框架,支持Scala、Java和Python等多种语言。在Python中,Pandas库与Spark相结合,可以高效地处理大规模数据。而Matplotlib、Seaborn等可视化库则帮助我们以图形形式展示分析结果,直观理解...
早期,DBA主要依赖于shell、perl、python和php等脚本语言进行运维,后来逐渐转向java/groovy/scala、c/c++以及hadoop/spark/storm等大数据技术。这一过程中,DBA的角色逐渐转变为具备研发技能的复合型人才。 2003年...