08函数柯里化

本文最后更新于 2021-08-05 11:42:59

函数柯里化

1
2
def add(x: Int, y: Int) = x + y
def addCurry(x: Int)(y: Int) = x + y

以上两个函数实现的都是两个整数相加的功能。对于add方法,调用方式为add(1,2)。对于addCurry方法,调用的方式为addCurry(1)(2)。这种方式就叫做柯里化。说得更加简单粗暴一点,有多个参数列表,或者说多个小括号括起来的函数参数列表的函数就是柯里化函数

curry化最大的意义在于把多个参数的函数等价转化成多个单参数函数的级联,这样所有的函数就都统一了,方便做lambda演算。 在scala里,curry化对类型推演也有帮助,scala的类型推演是局部的,在同一个参数列表中后面的参数不能借助前面的参数类型进行推演,curry化以后,放在两个参数列表里,后面一个参数列表里的参数可以借助前面一个参数列表里的参数类型进行推演

实现过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def addCurry(x: Int)(y: Int) = x + y
|
|
V
def addCurry(x: Int)=(y: Int) = x + y
| 相当于调用addCurry(x:Int) 返回一个函数
| addCurry(1) <--(y:Int)=1+y
V
var result = (y:Int)=1+y
|
|
V
result(2)
|
|
V
3

Demo

1
2
3
4
5
6
7
8
9
10
def foldLeft[B](z: B)(f: (B, A) => B): B = {
var acc = z
var these = this
while (!these.isEmpty) {
acc = f(acc, these.head)
these = these.tail
}
acc
}

1
2
3
4
5
def foldtest() = {
val list = List(1, 2, 3)
val strResleft = list.foldLeft("res:")((x: String, y:Int) => x + y)
println(strResleft)
}

自己实现While循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
object RecursiveDemo2 {
def main(args: Array[String]): Unit = {
var a = 0
//一句代码可以省略{}
//一坨代码可以省略()
loop(a<=100){
println(a)
a+=1
}
}

def loop(condition: =>Boolean)(op: => Unit):Unit={
if(condition){
op
loop(condition)(op)
}
}
}

08函数柯里化
https://jiajun.xyz/2020/11/03/scala/08函数柯里化/
作者
Lambda
发布于
2020年11月3日
更新于
2021年8月5日
许可协议