4. 操作也是对象(Operations Are Objects)
Scala是一种函数式编程语言,也就是说每一个函数都是一个值。Scala有很简洁的语法用于定义匿名和curry化函数(curried function,functional programming的概念之一,名字源于Haskell Curry,Haskell的发明者,一般都不翻译。本文后面并没有针对这个概念的解释和实现,有兴趣者请参阅相关参考资料——译注),以及嵌套函数等。
4.1. 方法是函数式值(Methods are Functional Values)
为了演示如何将函数作为一个值使用,我们定义一个exists函数,用于检测一个数组当中是否有符合条件的元素:
def exists[T](xs: Array[T], p: T => Boolean) = {
var i: Int = 0
while (i < xs.length && !p(xs(i))) i = i + 1
i < xs.length
}
方法参数[T]表示数组类型是任意的(类型参数在5.1节中详细介绍),参数p表示验证条件也是任意的,p的类型是函数类型(function type)T=>Boolean,表示所有定义域是T类型,值域是Boolean的函数。函数参数可以像普通函数一样执行,如上面的循环体中显示的p被调用那样。以函数作为参数或者返回值的函数,称为高阶函数。
定义了exists,我们可以通过双重否定来定义一个函数forall,表示数组的所有元素没有一个不符合条件的,该函数定义如下:
def forall[T](xs: Array[T], p: T => boolean) = {
def not_p(x: T) = !p(x)
!exists(xs, not_p)
}
函数forall内部定义了一个嵌套函数not_p,表示不满足条件p。嵌套函数可以访问所在环境的函数参数和本地变量,例如not_p访问了forall的参数p。
Scala还可以定义一个没有名字的函数,例如下面这个简版的forall函数:
def forall_short[T](xs: Array[T], p: T => boolean) =
!exists(xs, (x: T) => !p(x))
其中(x: T) => !p(x)定义了一个匿名函数(anonymous function),将类型为T的参数p映射为!p(x)。
有了exists和forall,我们可以定义一个函数hasZeroRow,用以检验一个二维矩阵是否有一行全是0:
def hasZeroRow(matrix: Array[Array[int]]) =
exists(matrix, (row: Array[int]) => forall(row, 0 ==))
表达式forall(row, 0 ==)用于检测row是否只包含0。这里,0的==方法被作为参数传递给forall的参数p,这显示了方法本身也是值,有点类似于C#中的“delegates”。
分享到:
相关推荐
#### 二、Scala概述 ##### 2.1 什么是Scala Scala是一种多范式编程语言,它结合了面向对象编程与函数式编程的特点。Scala语言的设计目标之一就是尽可能地提高代码的可读性和简洁性,同时保持高性能。由于Scala运行...
- **函数式编程**:同时,Scala也支持函数式编程范式,包括高阶函数、不可变数据结构等。 - **兼容性**:Scala可以在Java平台上运行,可以调用Java库,并且与Java代码无缝交互。 - **简洁性**:Scala通过减少冗余...
10.模式匹配:Scala提供了强大的模式匹配功能,用于解构对象并基于其结构执行不同的操作。这在处理枚举、列表和其他数据结构时特别有用。 通过这些特性,Scala试图提供一个更强大、更灵活的平台,支持构建高度模块...
- **面向对象**:Scala是纯粹的面向对象语言,每一个值都是对象,所有的操作都是方法调用。 - **函数式编程**:Scala同时也是一个成熟的函数式编程语言,支持高阶函数、模式匹配等功能。 - **类型推断**:Scala具有...
Scala概述.pptx 变量.pptx 运算符.pptx 程序流程控制.pptx 函数式编程基础.pptx 面向对象编程(基础部分).pptx 面向对象编程(中级部分).pptx 面向对象编程(高级特性).pptx 隐式转换和隐式参数.pptx 集合(上)-基本使用...
本教程将探讨如何使用 Scala 语言来操作 Spark,并介绍如何与 MySQL 数据库和 HDFS(Hadoop 分布式文件系统)进行交互。以下是相关知识点的详细说明: **1. Scala 语言基础** Scala 是一种多范式编程语言,融合了...
此外,教程可能还会介绍如何使用Scala的模式匹配、Actor模型(用于并发编程)以及Scala与Java互操作性。 "Programming in Scala"是一本权威的Scala指南,由Martin Odersky(Scala的创造者)和其他专家合著。这本书...
#### Scala概述 Scala是一种相对新兴的编程语言,旨在为Java虚拟机(JVM)以及后来的通用语言运行时(CLR)提供支持。它融合了函数式编程(Functional Programming, FP)与面向对象编程(Object-Oriented Programming, OOP...
#### 一、Scala语言概述 **Scala**是一种强大的多范式编程语言,它将面向对象编程和函数式编程的最佳特性融合在一起。作为一种类Java的语言,Scala旨在提供比Java更简洁、更灵活且功能更丰富的编程体验。 - **面向...
### Scala in Action: 关键知识点概述 #### 一、标题:Scala in Action - **书名解析**:“Scala in Action”这一标题明确指出本书聚焦于Scala编程语言的应用实践。通过“in Action”的后缀,作者旨在传达一种实用...
**Scala概述**: - **定义**:Scala是一种功能强大的编程语言,旨在集成面向对象编程和函数式编程的特点。它运行在Java平台上,并且与Java高度兼容。 - **为何选择Scala**: - **优雅性**:良好的API设计可以极大...
根据提供的文件信息,本书《Learning Scala》是一本旨在为读者提供Scala语言深入理解与实践操作的指南。Scala是一种结合了面向对象编程与函数式编程特性的强大语言,它运行在Java虚拟机(JVM)上,具有强大的类型...
Scala是一种多范式编程语言,它融合了面向对象和函数式编程的概念,旨在提供一种更高级别的抽象,使代码更加简洁、优雅。由于其与Java虚拟机(JVM)的紧密集成,Scala程序可以直接在Java平台上运行,这也是它被标记...
#### 一、Scala概述与特点 Scala是一种多范式的编程语言,旨在集成面向对象编程和函数式编程的各种特性。它运行于Java平台(Java虚拟机JVM),并且能够完全兼容所有的Java程序。这使得Scala不仅能够利用Java生态...
- **列表操作**:对`List`的所有操作都会返回一个新的`List`对象,不会修改原有列表。 - 例如,可以使用`++`或`:::`运算符来合并列表。 - **列表切片**:使用`slice`方法可以从列表中提取子列表。 ##### 可变序列 ...