scala-currying化
scala的加里化(currying)纠结了很久。通过Scala Worksheet 可以打印很多调试信息,所以用它写了一些测试代码,帮助自己理解。
object test {
//一个参数列表,3个参数
def sum(a: Int, b: Int, c: Int) = a + b + c //> sum: (a: Int, b: Int, c: Int)Int
//将一个参数列表,拆分成三个参数列表
def sum4(a: Int)(b: Int)(c: Int) = a + b + c //> sum4: (a: Int)(b: Int)(c: Int)Int
//sum4的偏应用函数
val fn4 = sum4 _ //> fn4 : Int => (Int => (Int => Int)) = <function1>
//根据偏应用函数,便可定义出如下函数:
def sum44(a: Int) = {
(b: Int) =>
{
(c: Int) =>
{
a + b + c
}
}
} //> sum44: (a: Int)Int => (Int => Int)
//自定义函数的偏应用函数
val fn44 = sum44 _ //> fn44 : Int => (Int => (Int => Int)) = <function1>
sum(1, 2, 3) //> res0: Int = 6
sum4(1)(2)(3) //> res1: Int = 6
sum44(1)(2)(3) //> res2: Int = 6
//将2,3分别偏应用到第一个,第二个参数上
val fn44_2 = sum44(2)(3)(_:Int) //> fn44_2 : Int => Int = <function1>
fn44_2(4) //> res3: Int = 9
fn44_2.apply(4) //> res4: Int = 9
}
- 偏函数应用是找一个函数,固定其中的几个参数值,从而得到一个新的函数。
- 函数加里化是一种使用匿名单参数函数来实现多参数函数的方法。
- 函数加里化能够让你轻松的实现某些偏函数应用。
参考:
闭包的定义 https://en.wikipedia.org/wiki/Closure_(computer_programming)
加里化的定义 https://en.wikipedia.org/wiki/Currying
scala-currying化的更多相关文章
- [Scala] Currying
Currying是一種函數式編程技巧, 指的是把接受多個參數的函數變換成接受一個單一參數的函數. 以一個簡單的例子在Scala中實現.. def f(a:Int, b:Int)={ a+b } //f ...
- scala 数据结构(九):-filter、化简
1 filter filter:将符合要求的数据(筛选)放置到新的集合中 应用案例:将 val names = List("Alice", "Bob", &qu ...
- Scala_方法、函数、柯里化
方法.函数.柯里化 方法 声明方法: scala> def m1(x:Int,y:Int):Int = { | x + y | }m1: (x: Int, y: Int)Ints ...
- 【大数据】Scala学习笔记
第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java 以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...
- Currying 及应用
Currying,中文多翻译为柯里化,感觉这个音译还没有达到类似 Humor 之于幽默的传神地步,后面直接使用 Currying. 什么是 Currying Currying 是这么一种机制,它将一个 ...
- Scala_方法和函数
方法的定义 def functionName([参数列表]) : [return type] = { function body return [] } 如果没有=和{}包裹的方法体,那么该方法被隐式 ...
- javascript-this,call,apply,bind简述3
上节介绍了call()和apply()的用法,这节再讨论一下arguments参数和bind函数的用法以及函数柯里化就算是完结了. bind()函数 先看定义: bind()方法会创建一个函数的实例, ...
- 大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配
第十一章 数据结构(下)-集合操作11.1 集合元素的映射-map11.1.1 map 映射函数的操作11.1.2 高阶函数基本使用案例1+案例211.1.3 使用 map 映射函数来解决11.1.4 ...
- EventEmitter:从命令式 JavaScript class 到声明函数式的华丽转身
新书终于截稿,今天稍有空闲,为大家奉献一篇关于 JavaScript 语言风格的文章,主角是函数声明式. 灵活的 JavaScript 及其 multiparadigm 相信"函数式&quo ...
- RDD的详解、创建及其操作
RDD的详解 RDD:弹性分布式数据集,是Spark中最基本的数据抽象,用来表示分布式集合,支持分布式操作! RDD的创建 RDD中的数据可以来源于2个地方:本地集合或外部数据源 RDD操作 分类 转 ...
随机推荐
- 第07组 Alpha冲刺(1/4)
队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:完成人员分配,初步学习Android开发 Github签入记录 接下来的计划:继续完成Android开发的学习,带领团队进行前后端开 ...
- 《MIT 6.828 Homework 1: boot xv6》解题报告
本作业的网站链接:MIT 6.828 Homework 1: boot xv6 问题 Exercise: What is on the stack? While stopped at the abov ...
- zabbix监控mysql主从同步和延迟
https://blog.csdn.net/natmazz/article/details/90581490 https://www.cnblogs.com/01-single/p/10602610. ...
- docker中启动2个mysql实列
一.mac环境安装docker容器 在docker官网中下载docker容器,地址:https://www.docker.com/products/docker-desktop 具体安装教程及设置网络 ...
- Kettle无法打开文件资源库
问题: Kettle无法打开文件资源库. 问题描述: 新建文件资源库之后,资源库路径中有中文路径.退出kettle之后,再次进去发现没有了右上角的connect按钮了. 原因: kettle的repo ...
- PHP和js判断访问设备是否是微信浏览器实例
PHP和js判断访问设备是否是微信浏览器实例,代码非常精简,适合新手学习. js判断是否是微信浏览器: 1 function is_weixin() { 2 var ua = window.navig ...
- 待解决问题 jscore 与 node.js jsbridge
jscore 与 node.js jsbridge https://juejin.im/post/5b395eb96fb9a00e556123ef
- ADO.NET连接数据库增删查改创建公用类
顺序如下:再web.config中添加数据库的用户名和密码 创建公用类. //添加进web.config中的账号和密码 /*<connectionStrings> <add name ...
- Angular 变更检测
angular 的钩子函数有 content 和 view , Docheck 子控件中有属性变化的时候,父组件的 Docheck content view 这3个会依次执行,即使这个属性不在 ...
- ie/chorme 清除缓存 刷新js,css
1 有时候你发现你刚改过的js 没有用,然后就是你的浏览器 没有清楚缓存,它可能还是保存的之前的 网页文件: chorme 浏览器下(版本:ver 59.0.3071.104(正式版本) (64 位) ...