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 定义 依据定义来说,柯里化就是将一个接收"多个"參数的函数拆分成一个或者很多个接收"单一"參数的函数.定义看起来是比較抽象的. ...
随机推荐
- vue+element-ui项目搭建实战
1.使用vue ui创建vue工程 利用vue-cli提供的图形化工具快速搭建vue工程: 命令行运行:vue ui 工程结构说明 build:项目构建webpack(打包器)相关代码 config: ...
- C++字符串大写字母转小写字母
#include <iostream> #include <stdio.h> using namespace std; char* Capital_to_Small(char* ...
- Mqtt开发笔记:Mqtt服务器搭建
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- django中update_or_create()
update_or_create()方法中有一个defaults参数 模型字段会根据查询条件进行查询,如果查询到了,那么就用defaults对应的值去更新字段,如果没有查到就用defaults对应的值 ...
- 05、etcd 读请求执行流程
本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢. 1.etcd读请求概览 etcd是典型的读多写少存储,在我们实际业务场景中,读一般占据2/3以上的请求.一个读 请求从client通过R ...
- 基于图数据库 NebulaGraph 实现的欺诈检测方案及代码示例
本文是一个基于 NebulaGraph 图算法.图数据库.机器学习.GNN 的 Fraud Detection 方法综述.在阅读本文了解欺诈检测的基本实现方法之余,也可以在我给大家准备的 Playgr ...
- Java 练习题 5岁的狗按人的年龄计算的话,前两年每一年是人的 10.5岁,之后每一年 * 增加4岁。如果5岁的狗、相当于人的多少年龄 * 10.5 + 10.5 + 4 +4 +4=33岁
1 /*** 2 * 练习题 3 * 5岁的狗按人的年龄计算的话,前两年每一年是人的 10.5岁,之后每一年 4 * 增加4岁.如果5岁的狗.相当于人的多少年龄 5 * 10.5 + 10.5 + 4 ...
- SQLServer 导入 Excel 表数据报错“文本被截断。。。”
报错详情(关键信息就是:文本被截断) 错误 0xc020901c: 数据流任务 1: 输出"Excel 源输出"(9) 上的 输出列"xxxxx"(78) 出错 ...
- Djiango视图层和模型层
Djiango 使用教程 目录 Djiango 使用教程 一. 视图层 1.1 HttpResponse,render,redirect 1.2 JsonResponse 1.3 form表单上传文件 ...
- redis同步锁的真实应用场景
一.问题由来 现在正在做的小程序后台中,有一个功能叫做高光时刻,在操作高光时刻的时候,可能会有多个用户来同时想操作这个功能,可是在同一时间只能 有一个用户能够操作.刚开始做的时候,自己的做法是在red ...