函数组合

让我们创建两个函数:

def f(s: String) = "f(" + s + ")" 
def g(s: String) = "g(" + s + ")" 

compose

compose 组合其他函数形成一个新的函数 f(g(x))

val fComposeG = f _ compose g _ 
fComposeG("yay") // f(g(yay)) 

andThen

andThen 和 compose很像,但是调用顺序是先调用第一个函数,然后调用第二个,即g(f(x))

val fAndThenG = f _ andThen g _ 
fAndThenG("yay") // g(f(yay)) 

柯里化 vs 偏应用

case 语句

那么究竟什么是case语句?

这是一个名为PartialFunction的函数的子类。

多个case语句的集合是什么?

他们是共同组合在一起的多个PartialFunction。

理解PartialFunction(偏函数)

对给定的输入参数类型,函数可接受该类型的任何值。换句话说,一个(Int) => String 的函数可以接收任意Int值,并返回一个字符串。

对给定的输入参数类型,偏函数只能接受该类型的某些特定的值。一个定义为(Int) => String 的偏函数可能不能接受所有Int值为输入。

isDefinedAt 是PartialFunction的一个方法,用来确定PartialFunction是否能接受一个给定的参数。

注意 偏函数PartialFunction 和我们前面提到的部分应用函数是无关的。

val one: PartialFunction[Int, String] = { case 1 => "one" } 
one.isDefinedAt(1) // true  
one.isDefinedAt(2) // false 

您可以调用一个偏函数。

one(1) // one 

PartialFunctions可以使用orElse组成新的函数,得到的PartialFunction反映了是否对给定参数进行了定义。

val two: PartialFunction[Int, String] = { case 2 => "two" } 
val three: PartialFunction[Int, String] = { case 3 => "three" } 
val wildcard: PartialFunction[Int, String] = { case _ => "something else" } 
val partial = one orElse two orElse three orElse wildcard 
partial(5) // something else  
partial(3) // three  
partial(2) // two  
partial(1) // one  
partial(0) // something else 

case 之谜

上周我们看到一些新奇的东西。我们在通常应该使用函数的地方看到了一个case语句。

case class PhoneExt(name: String, ext: Int) defined class PhoneExt  
val extensions = List(PhoneExt("steve", 100), PhoneExt("robey", 200)) 
extensions.filter { case PhoneExt(name, extension) => extension < 200 } // List(PhoneExt(steve,100)) 

为什么这段代码可以工作?

filter使用一个函数。在这个例子中是一个谓词函数(PhoneExt) => Boolean。

PartialFunction是Function的子类型,所以filter也可以使用PartialFunction!

Scala学习(四)——模式匹配与函数组合的更多相关文章

  1. Scala学习(四)---映射和元组

    映射和元组 摘要: 一个经典的程序员名言是:"如果只能有一种数据结构,那就用哈希表吧".哈希表或者更笼统地说映射,是最灵活多变的数据结构之一.映射是键/值对偶的集合.Scala有一个通用的叫法:元组, ...

  2. Scala学习(二)--- 控制结构和函数

    控制结构和函数 摘要: 本篇主要学习在Scala中使用条件表达式.循环和函数,你会看到Scala和其他编程语言之间一个根本性的差异.在Java或C++中,我们把表达式(比如3+4)和语句(比如if语句 ...

  3. Scala学习四——映射和数组

    一.本章要点 Scala有十分易用的语言来创建,查询和遍历映射 你需要从可变和不可变的映射中做出选择 默认情况下,你得到的是一个哈希映射,不过你也可以指明要树形映射 你可以很容易地在Scala映射和J ...

  4. Scala学习二——控制结构和函数

    一.if表达式有值 val s=if(x>0) 1 else -1,相当于Java中x>0?1:-1(不过不拿呢个在?:中插入语句),而且Scala中可以用混合类型(如if (x>0 ...

  5. scala学习笔记(7):函数(1)

    函数是Scala的第一公民! 1  基本定义 scala> def max(x: Int, y: Int): Int = { if (x > y) x else y } 跟着是括号里带有冒 ...

  6. scala学习笔记:理解函数

    定义一个函数: scala> def foo(x:Int)=x*2 foo: (x: Int)Int 可以采用匿名参数: scala> def foo:((Int)=>Int) = ...

  7. Scala学习(四)练习

    映射和元组&练习 1. 设置一个映射,其中包含你想要的一些装备,以及它们的价格.然后构建另一个映射,采用同一组键,但在价格上打9折 映射代码如下: object HelloScala{ def ...

  8. scala学习笔记4:函数和闭包

    以下主要记录的是看完scala in programming这本书functions and closures(第八章)后的要点总结. 1,函数可以存在的地方:函数方法,嵌套函数. 2,关于funct ...

  9. scala 学习笔记--模式匹配

    1.switch java代码 switch (cause) { case ‘2‘ : dropTime=time; case ‘8’:case ‘9’ : case ‘10’:case ‘11’ : ...

随机推荐

  1. laravel 5.7 引入Illuminate\Http\Request 在类内调用 Request 提示不存在的问题

    laravel报错: ReflectionException Class App\Http\Controllers\Request does not exist 解决办法: namespace App ...

  2. 教你用python爬取网站美女图(附代码及教程)

    我前几篇文章都是说一些python爬虫库的用法,还没有说怎样利用好这些知识玩一些好玩的东西.那我今天带大家玩好玩又刺激的,嘻嘻!对了,requests库和正则表达式很重要的,一定要学会!一定要学会!! ...

  3. python异步IO编程(二)

    python异步IO编程(二) 目录 开门见山 Async IO设计模式 事件循环 asyncio 中的其他顶层函数 开门见山 下面我们用两个简单的例子来让你对异步IO有所了解 import asyn ...

  4. mysql alter 语句用法,添加、修改、删除字段、索引、主键等

    修改表名: ALTER  TABLE admin_user RENAME TO a_use //增加主键 [sql] view plaincopy alter table tabelname add  ...

  5. SSD源码解读——数据读取

    之前,对SSD的论文进行了解读,可以回顾之前的博客:https://www.cnblogs.com/dengshunge/p/11665929.html. 为了加深对SSD的理解,因此对SSD的源码进 ...

  6. 20199319《Linux内核原理与分析》第十一周作业

    ShellShock攻击实验 什么是ShellShock Shellshock,又称Bashdoor,是在Unix中广泛使用的Bash shell中的一个安全漏洞,首次于2014年9月24日公开.许多 ...

  7. 模拟赛小结:2017 China Collegiate Programming Contest Final (CCPC-Final 2017)

    比赛链接:传送门 前期大顺风,2:30金区中游.后期开题乏力,掉到银尾.4:59绝杀I,但罚时太高卡在银首. Problem A - Dogs and Cages 00:09:45 (+) Solve ...

  8. Java 实现《编译原理》简单词法分析功能 - 程序解析

    Java 实现<编译原理>简单词法分析功能 - 程序解析 简易词法分析功能 要求及功能 (1)读取一个 txt 程序文件(最后的 # 作为结束标志,不可省去) { int a, b; a ...

  9. 记录一下RAC的使用

    1  常规的对数组的操作,包括遍历.刷选.映射.替换 // 遍历 NSArray * array = @["]; [array.rac_sequence.signal subscribeNe ...

  10. struts配置访问后缀为.do,.action,.*

    Struts 配置文件的加载顺序 Struts-default.xml---> struts-plugin.xml--> struts.xml-->   struts.propert ...