Scala 函数闭包和柯里化
1 package com.atguigu.function
2
3 object HighFunction {
4 def main(args: Array[String]): Unit = {
5 /* val fun = (x: Int, y: String, z: Char) => {
6 if (x==0 && y=="" && z=='0'){
7 true
8 }else{
9 false
10 }
11 }
12 println(fun(0,"",'1'))*/
13
14 /*
15 练习 2: 定义一个函数 func,它接收一个 Int 类型的参数,返回一个函数(记作 f1)。
16 它返回的函数 f1,接收一个 String 类型的参数,同样返回一个函数(记作 f2)。函数 f2 接
17 收一个 Char 类型的参数,返回一个 Boolean 的值。
18 要求调用函数 func(0) (“”) (‘0’)得到返回值为 false,其它情况均返回 true。
19 */
20 def func(x: Int) = {
21 def f1(y: String) = {
22 println("我是f1!")
23
24 def f2(z: Char): Boolean = {
25 println("我是f2!")
26 if (x == 0 && y == "" && z == '0') false else true
27 }
28 f2 _
29 }
30
31 f1 _
32 }
33
34 // func(1)("")('1')
35 }
36
37 println("```````````````````````````")
38
39 def f1() = {
40 var a: Int = 10
41
42 def f2(b: Int) = {
43 a + b
44 }
45
46 f2 _
47 }
48
49 // 在调用时,f1 函数执行完毕后,局部变量 a 应该随着栈空间释放掉
50 val f = f1()
51 // 但是在此处,变量 a 其实并没有释放,而是包含在了 f2 函数的内部,形成了闭合的效果
52 println(f(3))
53 println(f1()(3))
54
55 //闭包
56 /*
57 addByFour函数:
58 内部定义一个局部变量a 固定值是4
59 函数的返回值是一个嵌套函数,完成a+b的操作,当外部调用时,addByFour()(2)只需要控制第二个形参的数值
60 而第一个加数永远是4,相当于固定了一个参数
61 */
62 def addByFour(): Int => Int = {
63 val a = 4
64
65 def addB(b: Int): Int = {
66 a + b
67 }
68
69 addB
70 }
71 println("结果是:" + addByFour()(3)) //4+3
72 }
函数柯里化,其实就是将复杂的参数逻辑变得简单化,函数柯里化一定存在闭包
1 //函数柯里化:把一个参数列表的多个参数,变成多个参数列表 也就是fun(a,b,c) -> fun(a)(b)(c) 分层函数调用
2 def addCurry(a : Int)(b:Int):Int ={
3 a+b
4 }
5 println("柯里化:"+addCurry(34)(23))
Scala 函数闭包和柯里化的更多相关文章
- Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化
承接上文:Java函数式编程:一.函数式接口,lambda表达式和方法引用 这次来聊聊函数式编程中其他的几个比较重要的概念和技术,从而使得我们能更深刻的掌握Java中的函数式编程. 本篇博客主要聊聊以 ...
- JavaScript 闭包&基于闭包实现柯里化和bind
闭包: 1 函数内声明了一个函数,并且将这个函数内部的函数返回到全局 2 将这个返回到全局的函数内中的函数存储到全局变量中 3 内部的函数调用了外部函数中的局部变量 闭包简述: 有权访问另一个函数局部 ...
- Scala基础:闭包、柯里化、隐式转换和隐式参数
闭包,和js中的闭包一样,返回值依赖于声明在函数外部的一个或多个变量,那么这个函数就是闭包函数. val i: Int = 20 //函数func的方法体中使用了在func外部定义的变量 那func就 ...
- 浅析 JavaScript 中的 函数 uncurrying 反柯里化
柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...
- 学好Spark/Kafka必须要掌握的Scala技术点(三)高阶函数、方法、柯里化、隐式转换
5. 高阶函数 Scala中的高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等,可以把函数作为参数传递给方法或函数. 5.1 作为值的函数 定义函数时格式: val 变量名 = (输入参数类型和个 ...
- swift 学习(二)基础知识 (函数,闭包,ARC,柯里化,反射)
函数 func x(a:Int, b:Int) {} func x(a:Int, b:Int) -> Void {} func x(a:Int, b:Int) ->(Int,Int ...
- JS的闭包、高阶函数、柯里化
本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...
- Scala中的柯里化
一.初识Currying柯里化 柯里化(Currying)技术 Christopher Strachey 以逻辑学家 Haskell Curry 命名的(尽管它是 Moses Schnfinkel ...
- JS 函数的柯里化与反柯里化
===================================== 函数的柯里化与反柯里化 ===================================== [这是一篇比较久之前的总 ...
- 柯里化函数之Javascript
柯里化函数之Javascript 定义 依据定义来说,柯里化就是将一个接收"多个"參数的函数拆分成一个或者很多个接收"单一"參数的函数.定义看起来是比較抽象的. ...
随机推荐
- ORA-22828 输入样式或替换参数超过了32k大小限制
今天调试程序报以下错误: ORA-22828: input pattern or replacement parameters exceed 32K size limit 22828. 00000 - ...
- 开源开发者的狂欢,STRK开了一个好头!附领取价值800元的web3空投教程
这两天在Github和推特上最热闹的事情便是知名ETH(以太坊)二层公链项目STRK给所有gtihub上排名前5000的开源项目的项目贡献者提供了价值800元的代币空投,其中不乏前端程序员.大学生等w ...
- std::vector<std::string> 与 char** 的转换
vecotr 容器中插入多条字符串,再将 vector 的地址转换为 char** 代码如下: #include <stdio.h> #include <string> #in ...
- OsgEarth开发笔记(二):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(中)
上一篇:<OsgEarth开发笔记(一):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(上)>下一篇:敬请期待- 前言 上一篇编译了osg和osgCurl ...
- 通过paramiko模块操作服务器
用于帮助开发者通过代码远程连接服务器,并对服务器进行操作. 如果下面运行错误了,可以看我另外一篇文章有解决办法解决paramiko连接远程服务器错误 pip3 install paramiko imp ...
- 04-Redis系列之-持久化(RDB,AOF)
持久化的作用 什么是持久化 redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上 持久化的实现方式 快照:某时某刻数据的一个完整备份(mysql的Dump,redis的RDB) 写日志: ...
- 终端SSH远程连接CentOS报错:-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
终端SSH远程连接CentOS时,报以下错误提示: -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such ...
- 一文上手图数据备份恢复工具 NebulaGraph BR
作者:NebulaGraph 工程师 Kenshin NebulaGraph BR 开源已经有一段时间了,为了给社区用户提供一个更稳.更快.更易用的备份恢复工具,去年对其进行了比较大的重构.Nebul ...
- 【对比】Gemini:听说GPT-4你小子挺厉害
前言 缘由 谷歌连放大招:Gemini Pro支持中文,Bard学会画画 事情起因: 一心只读圣贤书的狗哥,不经意间被新闻吸引.[谷歌最新人工智能模型Gemini Pro已在欧洲上市 将与ChatGP ...
- Java 创建类,对象+调用方法
1 //测试类 2 public class PersonTest 3 { 4 public static void main(String[] args) 5 { 6 //创建Person类的对象 ...