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