函数柯里化 | 学习笔记

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

开发者学堂课程【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.用案例介绍函数柯里化的最佳实践,用一个案例说明,函数柯里化全部转大写(或小写),比表是否相等,使用函数柯里化思想来完成任务

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

相关文章
|
6月前
|
程序员 编译器 C++
函数介绍
函数介绍
73 1
|
4月前
|
算法 C++ 容器
|
6月前
|
存储 Python
Python函数参数传递
Python函数参数传递
61 1
|
JavaScript 开发者
什么是高阶函数
什么是高阶函数
|
6月前
|
存储
07-python函数的进阶-函数的多返回值/函数的多种传参方式/匿名函数/lambda函数
07-python函数的进阶-函数的多返回值/函数的多种传参方式/匿名函数/lambda函数
|
6月前
|
Python
Python函数式编程,举例说明高阶函数的使用。
Python函数式编程,举例说明高阶函数的使用。
62 2
|
6月前
函数(二)
函数(二)
25 0
|
11月前
|
机器学习/深度学习
函数的使用
任务1 统计小组一门课程的总分及平均分。
59 1
1 # 高阶函数
1 # 高阶函数
61 0
|
程序员 编译器 开发者
函数(1)
函数(1)
115 0
函数(1)