函数柯里化 | 学习笔记

简介: 快速学习函数柯里化

开发者学堂课程【Scala 核心编程 - 进阶函数柯里化学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9094


函数柯里化


内容介绍:

一、基本结束

二、函数柯里化快速入门

三、函数柯里化最佳实践

四、总结


一、基本介绍

函数柯里化(curry)数学家库里提出

1.函数编程中,接受多个参数的函数都可以转化为接受单个参数的函数,这个转化过程就叫柯里化

2.柯里化就是证明了函数只需要一个参数而已。其实我们刚才的学习过程中,已经涉及到了柯里化操作。

如:

高阶函数

高阶函数可以返回函数类型

def minusxy(x: lnt)= {

(y: Int)=> x -y//匿名函数

}

val result3 =minusxy(3)(5)

println(result3)

函数柯里化的使用,说明函数只需要一个参数而已

3.不用设立柯里化存在的意义这样的命题。柯里化就是以函数为主体这种思想发展的必然产生的结果。(即:柯里化是面向函数思想的必然产生结果)


二、函数柯里化快速入门

编写一个函数,接收两个整数,可以返回两个数的乘积,要求:

1.使用常规的方式完成

2.使用闭包的方式完成

3.使用函数柯里化完成

注意观察编程方式的变化。案例演示

//说明

常规写法

def mul(x:lnt,y:lnt)= x * y

println(mul(10,10))

闭包写法

def mulCurry(x: Int)= (y: Int)=> x*y

println(mulCurry(10)(9))

函数柯里化形式

def mulCurry2(x: Int)(y:Int) = x *y

println(mulCurry2(10)(8))

演示:

object curryDemoo1 {

def main(args : Array[string]): unit = {

def mulcurry2(x: Int)(y : Int) = x * yprintLn(mulcurry2( 10)(8))

}

}

运行结果:80


三、函数柯里化最佳实践

比较两个字符串在忽略大小写的情况下是否相等,注意,这里是两个任务:

任务由两件动作完成,逐个完成

1.全部转大写(或全部转小写)

2.比较是否相等

针对这两个操作,我们用一个函数去处理的思想,其实也变成了两个函数处理的思想(柯里化)

【案例演示+代码说明】

方式1:简单的方式,使用一个函数完成

def eq2(s1: String)(s2: String): Boolean = {

s1.toLowerCase == s2.toLowerCase

}

没有体现两个任务分开

方式2使用稍微高级的用法(隐式类):形式为str.方法()

object curryDemo02 {

def main(args : Array [string]): unit = {

//这是一个函数,可以接收两个字符串,比较是否相等

def eq(s1: String, s2: String): Boolean={

s1.equals(s2)}

}

//隐式类(创建一个隐式类的对象时,自动关联方法)

回忆隐式类:

基本介绍

在 scala2.10后提供了隐式类,可以使用implicit声明类,隐式类的非常强大,同样可以扩展类的能,比前面使用隐式转换丰富类库功能更加的方便,在集合中隐式类会发挥重要的作用。

案例:

def main(args: Array[String]): Unit = {

//DB1会对应生成隐式类

//DB1是一个隐式类,当我们在该隐式类的作用域范围,创建MySQL1

实例

//该隐式类就会生效,这个工作仍然编译器完成

//看底层..

implicit class DB1(val m: MySQL1) { //ImplicitClassDemoSDB1S2

def addSuffix(: String={

m + " scala"

}

}

用一个创建完成的,直接调用

用一个创建陌生的,直接调用

object curryDemo02 {

def main(args : Array [string]): unit = {

//这是一个函数,可以接收两个字符串,比较是否相等

def eq(s1: String, s2: String): Boolean={

s1.equals(s2)}

}

//隐式类(创建一个隐式类的对象时,自动关联方法)

implicit class TestEq(s: String){

def checkEq(ss: String)(f:(String,string)=> Boolean):Boolean ={

f(s.toLowerCase,ss.toLowerCase)

}

val str1 = "he1lo"

案例演示+说明+简化版(三种形式,直接传入匿名函数方式)str1.checkEq(str2)(_.equals(_))

举例:

//隐式类

implicit class TestEq( s: string) {

//体现了将比较字符串的事情,分解成两个任务完成

//1.checkeq 完转化大小写

//2. f函数完成比较任务

def checkEq(ss: string)(f: (string,string)f(s.toLowerCase,ss.toLowercase)

}

}

val str1 = "he1lo"

val str1 = "he1lo" 中的s ,其实传到了implicit class TestEq( s: string) { 中的s,继续传为def checkEq(ss: string)中 ss 中的s

val str1 = "hello"

Println(str1.checkEq("HELLO"))(eq))

输出结果为 true

//简写形式

Str1.checkEq("HELLO")(_.cquals(_))

是由

str1.checkEq("HeLLo")((s: string, s2: string) => s1.equals(s2))

转换而来

知道是字符串,所以类型 string 可以去掉,因为s1、s2双方一直可以去掉,用下划线代替,最终变成

Str1.checkEq("HELLO")(_.cquals(_))

返回结果为 true

如果写成

println(str1.checkEq("HeLLO~")(_.equals(_)))

则返回

False


四、总结

1.函数柯里化基本介绍的三个概念,函数柯里化使用次数较少

函数柯里化的应用有难度,需要猜测

2.快速入门案例三种方法(常规、闭包、柯里化),比较三种方法的变化,形式上有变化,本质没有

3.用案例介绍函数柯里化的最佳实践,用一个案例说明,函数柯里化全部转大写(或小写),比表是否相等,使用函数柯里化思想来完成任务

由面向对象完成任务变为由面向函数完成任务

相关文章
|
5月前
|
安全 API Python
详解手机状态查询API实战指南
手机状态查询API是一款高效接口,可实时识别手机号状态(实号、空号、风险号等),帮助企业筛选有效号码,提升业务触达率与客户体验。
597 0
|
5月前
计算故障诊断振动信号的时频域特征,得到特征向量
计算故障诊断振动信号的时频域特征,得到特征向量
146 0
|
4月前
|
存储 数据采集 数据可视化
Python爬取懂车帝/汽车之家评论并做竞品分析
Python爬取懂车帝/汽车之家评论并做竞品分析
|
5月前
|
缓存 边缘计算 前端开发
从业务需求到技术栈:电商API选型RESTful还是GraphQL?这5个维度帮你决策
在数字经济时代,电商平台的竞争已延伸至用户体验与系统效能。作为连接前后端及各类服务的核心,API接口的架构设计至关重要。本文对比RESTful与GraphQL两大主流方案,从电商场景出发,分析两者的技术特性、适用场景与选型逻辑,帮助开发者根据业务需求做出最优选择。
|
6月前
|
数据采集 供应链 搜索推荐
电商数据分析师进阶指南:高效运用API的N种技巧!
电商数据分析师如何合理运用电商API,已成为推动业务增长的重要课题。本文从电商API概述、运用步骤到实际案例,全面解析其在数据分析中的作用。通过明确数据需求、掌握调用技巧、清洗与分析数据,再到可视化呈现,分析师可挖掘用户行为、优化库存及支持精准营销。同时,面对数据安全、质量和技术挑战,需强化安全措施、提升技能并培养专业人才。合理运用电商API,将为企业解锁数据潜能,助力电商行业持续发展。
|
8月前
|
监控 算法 中间件
《揭秘性能测试:找准系统瓶颈的实用指南》
在软件开发中,性能测试与瓶颈分析是确保系统高效稳定运行的核心手段。性能测试通过模拟真实场景评估系统在不同负载下的表现,涵盖负载、压力、并发及耐久性测试等多个方面。这些测试帮助发现系统的性能极限与潜在问题,为优化提供依据。性能瓶颈可能源于硬件(如CPU、内存)或软件(如代码效率、数据库配置),需综合监控、日志分析和专业工具定位问题。针对瓶颈采取优化措施,如升级硬件、优化算法、调整数据库索引或改进系统架构,可显著提升性能。持续关注性能并进行优化,是保障用户体验与系统竞争力的关键。
223 1
|
8月前
|
机器学习/深度学习 并行计算 PyTorch
【pytorch】【202504】关于torch.nn.Linear
小白从开始这段代码展示了`nn.Linear`的使用及其背后的原理。 此外,小白还深入研究了PyTorch的核心类`torch.nn.Module`以及其子类`torch.nn.Linear`的源码。`grad_fn`作为张量的一个属性,用于指导反向传播 进一步地,小白探讨了`requires_grad`与叶子节点(leaf tensor)的关系。叶子节点是指在计算图中没有前驱操作的张量,只有设置了`requires_grad=True`的叶子节点才会在反向传播时保存梯度。 最后,小白学习了PyTorch中的三种梯度模式 通过以上学习小白对PyTorch的自动求导机制有了更深刻的理解。
368 6
|
9月前
|
人工智能 运维 自然语言处理
通义灵码 AI实战《手把手教你用通义灵码写一个音乐电子小闹钟》
通义灵码DeepSeek版本相比qwen2.5,增强了深度思考和上下文理解能力,显著提升了开发效率,尤其适合代码能力较弱的运维人员,真正实现了“代码即服务”。
384 4
|
消息中间件 存储 负载均衡
Apache Kafka核心概念解析:生产者、消费者与Broker
【10月更文挑战第24天】在数字化转型的大潮中,数据的实时处理能力成为了企业竞争力的重要组成部分。Apache Kafka 作为一款高性能的消息队列系统,在这一领域占据了重要地位。通过使用 Kafka,企业可以构建出高效的数据管道,实现数据的快速传输和处理。今天,我将从个人的角度出发,深入解析 Kafka 的三大核心组件——生产者、消费者与 Broker,希望能够帮助大家建立起对 Kafka 内部机制的基本理解。
482 2
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。