`
tongqingqiu
  • 浏览: 24804 次
  • 性别: Icon_minigender_1
  • 来自: 亚特兰大
社区版块
存档分类
最新评论

Scala基础(3)- 函数进阶

阅读更多

匿名函数

函数可以没有名称,可以直接赋值。如果函数有多行表达式组成,就加上大括号。这一点对匿名函数同样适用。

scala> val addOne = (x: Int) => x + 1
addOne: (Int) => Int = <function1>

scala> addOne(1)
res4: Int = 2

注意到Scala中一切都是对象。所以addOne是一个对象。同时它又是个包含一个参数的函数。此时,函数和对象得到了统一。

偏函数应用 (Partial Application)

偏函数应用解决这样的问题:如果我们有函数是多个参数的,我们希望能固定其中某几个参数的值。在Scala中,我们可以这么做

scala> def adder(m: Int, n: Int) = m + n
adder: (m: Int,n: Int)Int
scala> val add2 = adder(2, _:Int)
add2: (Int) => Int = <function1>

scala> add2(3)
res50: Int = 5

函数柯里化(Currying)

偏函数应用不是什么新东西,几乎所有编程语言中都可以简单地实现。但更简洁的实现是柯里化。

你可以这样定义柯里化 函数

scala> def multiply(m: Int)(n: Int): Int = m * n
multiply: (m: Int)(n: Int)Int

也可以对一个已有的函数进行转换。例如之前的adder函数

scala> (adder _).curried
res1: (Int) => (Int) => Int = <function1>

函数柯里化依赖匿名函数,把一个多参数的函数转化为多个单参数的函数连接在一起。这样一来,语意的表达就更加丰富而直观,函数组合也更加灵活。

类型推断

一个应用场景就是类型推断。Scala类库中的foldLeft 就是这样一个例子。

def foldLeft[B](z: B)(op: (B, A) => B): B

List("").foldLeft(0)(_ + _.length)

如果使用普通的多参数函数定义

def foldLeft[B](z: B, op: (B, A) => B): B

那么,你在使用时就必须显示地表明类型。

List("").foldLeft(0, (b: Int, a: String) => a + b.length)
List("").foldLeft[Int](0, _ + _.length)

简化API

另一个currying的应用是简化API。在下面的例子中,你可以使用大括号来传递body,使得API调用层次分明。

def loop[A](n: Int)(body: => A): Unit = (0 until n) foreach (n => body)

loop(2) {
   println("hello!")
}

多阶段计算

如果你的多参数函数的计算实际上是分步骤的,某个步骤只依赖某个参数,比如下面的例子。那么柯里化会更加简单。

def v(t: Double, k: Double): Double = {
   // 只依赖于t
   val ft = f(t)

   g(ft, k)
}

v(1, 1); v(1, 2);
分享到:
评论

相关推荐

    scala讲解笔记 入门及进阶 PDF文档1-5

    第一部分:"Scala入门及进阶-part01-基础知识.pdf" 涵盖了Scala的基础概念。在这里,你会学习到Scala的安装与环境配置,理解Scala的基本语法,包括变量声明、数据类型(如基本类型、引用类型和集合类型)、控制结构...

    scala从入门到进阶

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,被广泛应用于大数据处理、并发系统和Web开发等领域。本教程“Scala从入门到进阶”旨在帮助初学者逐步掌握这一现代编程工具的核心概念和高级...

    Scala 编程 综合进阶向导

    Scala编程综合进阶向导有33章。本书介绍了一种新的编程语言,它把面向对象和函数式编程概念有机地结合为整体,从而形成一种完整统一、语义丰富的新思维体系。

    scala-advanced:Scala先进

    练习题-Scala函数式编程 函数式编程思想进阶 × scala-谜题 巩固基础 × scalatest 类库 类库扩展 × scala-json 操作(json4s) 类库扩展 √ shapeless 泛型编程库 类库扩展 × scala-app-cats cats 库相关操作 ...

    Scala-学习资料-mht.rar

    3. 函数式编程:Scala也是一门函数式语言,函数是第一类公民,可以作为参数传递,也可以作为返回值。它支持高阶函数、闭包、柯里化(Currying)和尾递归优化等特性。 4. 并发编程:Scala提供了Actor模型,这是一种...

    Scala编程-前13章-p183.7z

    这个压缩包“Scala编程-前13章-p183.7z”包含了Scala编程语言的基础到进阶知识的前13章节,旨在帮助初学者和开发者深入理解这一强大的函数式编程语言。 首先,让我们探讨Scala的基础知识。Scala是一种多范式的编程...

    最好的scala学习 课件

    首先,我们从"Scala进阶之路-part01-基础.pdf"开始,这部分内容主要涵盖了Scala的基础知识。你会学习到Scala的语法结构,包括变量声明、常量、数据类型(如基本类型、引用类型、集合类型)、运算符、流程控制语句...

    scala 中文教程下载

    该教程是一本详尽介绍Scala编程语言的书籍,共计15章,旨在帮助读者掌握Scala的基础语法及进阶内容。教程由Scala语言的设计者Martin Odersky及其团队成员Lex Spoon和Bill Venners共同编写,由Artima Press出版。 ##...

    Udemy-Scala-Functional-Programming-for-Beginners-Rock-the-JVM

    **课程标题解析:** "Udemy-Scala-Functional-Programming-for-Beginners-Rock-the-JVM" 这个标题表明这是一个在Udemy平台上专为初学者设计的 Scala 语言教程,着重于函数式编程,并且强调了如何在Java虚拟机(JVM)...

    scala 教程

    本书提供了对Scala语言的全面介绍,包括其基础语法、面向对象编程、函数式编程等方面的知识。 **重要特性:** - **面向对象**:Scala支持传统的面向对象编程范式,如类、继承、多态等。 - **函数式编程**:同时,...

    Functional Programming in Scala正式版

    - **目标读者**:本书适合已经熟悉Scala语言基础并对函数式编程感兴趣的开发者阅读。 - **主要内容**:本书分为三个部分,分别介绍了函数式编程的基础概念、设计方法以及常用的数据结构。 #### 四、函数式编程的...

    scala实操文档.zip

    3. **集合**(Scala进阶之路-part02-集合.pdf): Scala的集合库非常强大,包括List、Set、Map等多种类型。它们都是不可变的,提供了丰富的操作方法,如map、filter、fold等。Scala的集合还支持高阶函数,使得处理...

    about云spark开发基础之Scala快餐第二版.pdf

    - **书籍推荐**:《Scala Programming》是一本非常适合初学者的书,涵盖了Scala的基础和进阶知识。 - **在线课程**:Coursera和Udemy等平台上提供了许多免费和付费的Scala课程,适合不同水平的学习者。 通过上述...

    scala进阶之路完整文档PDF

    **Scala进阶之路** Scala是一种多范式编程语言,它结合了面向对象和函数式编程的概念,被广泛用于大数据处理和分布式系统。本教程旨在帮助读者深入理解Scala的高级特性和应用,涵盖以下五个关键部分: 1. **基础**...

    计算机专业基础理论电子书合集08----编程语言:scala

    《Scala Tutorial》可能是针对初学者的简明教程,提供了一个逐步学习Scala的路径,涵盖基础到进阶的知识点。 这些书籍涵盖了从入门到精通,从理论到实践的各个层面,无论你是初学者还是经验丰富的开发者,都能从中...

    Scala编程书合集

    另外,压缩包中还包括“熟练的掌握Scala语言系列课程.txt”,这可能是一个课程大纲或学习路径,指导读者按部就班地学习Scala,从基础到进阶,涵盖实战项目和最佳实践。 最后,“通常的Scala编写规范.txt”很可能...

    Programming In Scala 中文版及英文版

    3. **面向对象编程**:Scala是多范式语言,结合了面向对象和函数式编程。它支持类和对象,可以创建继承和多态的类层次结构。特质(Trait)提供了一种实现接口和混合行为的方式,可以用来解决Java中的单继承限制。 4...

    Scala in Depth

    本书由Scala之父作序推荐,深入探讨了Scala里几个较为复杂的领域,包括类型系统的高阶内容、隐式转换、特质的组合技巧、集合、Actor、函数式编程的范畴论等,而且不是干巴巴地讲述语言和库的概念。本书示例丰富,是...

    Programming in Scala

    3. **Next Steps in Scala(Scala进阶)**: - 进一步探索Scala的高级特性,如模式匹配(pattern matching)、隐式转换(implicit conversions)等。 - 深入理解Scala的类型系统,如何利用泛型(generics)编写灵活的...

Global site tag (gtag.js) - Google Analytics