柯里化(Currying)  

  把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

  简单的实现如下:

scala> def add(x:Int, y:Int) = x + y
add: (x: Int, y: Int)Int

  假如我们应用的时候,是这样的:add(1,2)

  柯里化函数

scala> def add(x:Int)(y:Int) = x + y

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

  如下是本人查阅资料所了解到Scala语言柯里化函数的四种写法:

第一种写法:

  不显示声明返回类型,Scala会自动推断出返回类型:

scala> def currying_1(x:Int) = {
| y:String => y * x
| } currying_1: (x: Int)String => String // =>符号意味着返回的是一个函数

  调用方式:

scala> currying_1()("scalA")
res0: String = scalAscalAscalA

第二种写法:

  显式声明返回类型——函数:

scala> def currying_2(x:Int): String => String = {
| y => y * x
| }
currying_2: (x: Int)String => String // =>符号左边的String对应的是y,=>符号右边的String就对应着y * x

  调用方式:

scala> type curry_2() //验证返回类型,确实是个函数
res5: String => String = <function1>

第三种写法:

  不显示声明返回类型,Scala会自动推断出返回类型:

scala> def currying_3(x:Int)(y:String) = {
| y * x
| }
currying_3: (x: Int)(y: String)String

  调用方式:

scala> currying_3()("ScalA")
res1: String = ScalAScalAScalA

第四种写法:

  显式声明返回类型:

scala> def currying_4(x:Int)(y:String): String = {
| y * x
| }
currying_4: (x: Int)(y: String)String

  调用方式:

scala> currying_4()("ScalaA")
res2: String = ScalaAScalaAScalaA

Scala函数柯里化(Currying or Curry)的更多相关文章

  1. 函数柯里化(Currying)示例

    ”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了两个示例,说明 ...

  2. Swift函数柯里化(Currying)简谈

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化.简单的说就是把接收多 ...

  3. 前端开发者进阶之函数柯里化Currying

    穆乙:http://www.cnblogs.com/pigtail/p/3447660.html 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接 ...

  4. 偏函数应用(Partial Application)和函数柯里化(Currying)

    偏函数应用指的是固化函数的一个或一些参数,从而产生一个新的函数.比如我们有一个记录日志的函数: 1: def log(level, message): 2: print level + ": ...

  5. 应用js函数柯里化currying 与ajax 局部刷新dom

    直接上代码吧 最近读javascript核心概念及实践的代码 感觉很有用 备忘. <div id="request"></div> <script t ...

  6. Javascript函数柯里化(curry)

    函数柯里化currying,是函数式编程非常重要的一个标志.它的实现需要满足以下条件,首先就是函数可以作为参数进行传递,然后就是函数可以作为返回值return出去.我们依靠这个特性编写很多优雅酷炫的代 ...

  7. 深入理解javascript函数进阶系列第二篇——函数柯里化

    前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细 ...

  8. JS中的柯里化(currying)

    何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...

  9. Scala 基础(十二):Scala 函数式编程(四)高级(二)参数(类型)推断、闭包(closure)、函数柯里化(curry)、控制抽象

    1  参数(类型)推断 参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以 ...

随机推荐

  1. VLC架构及流程分析

    0x00 前置信息 VLC是一个非常庞大的工程,我从它的架构及流程入手进行分析,涉及到一些很细的概念先搁置一边,日后详细分析. 0x01 源码结构(Android Java相关的暂未分析) # bui ...

  2. python私有工具库小结

    1.一些试用py工具清单 https://www.zhihu.com/question/60402355/answer/752917744?utm_source=wechat_session& ...

  3. pinpoint的只是总结

    1,对于拓扑图不显示的原因,可能是hbase版本和pp版本不匹配的原因2,calltree中出现 API-METADATA-NOT-FOUND时是因为HBASE中的元数据被清除了,需要重启应用才可以. ...

  4. 利用ViewStub实现布局懒惰加载

    这个问题也是头条面试官问的,本身没什么难度,但以前确实没仔细研究过. 1.使用介绍 ViewStub是一种不可见的尺寸为0的View,用来实现布局资源的懒加载.当ViewStub被设置为用户可见或其  ...

  5. 调用office Word Com 组件,提示权限不足处理

    最近一直在处理一个项目,项目主要功能与Office-Word 有关,主要涉及到文本内容编辑与样式设置等相关内容.因项目依赖office 相关dll,需要兼容多种Office 版本(office 200 ...

  6. Linux-普通用户切换为root身份

    Linux 下普通用户免密码切换 root 用户 具体步骤: 1)编辑 su 文件打开第四行注释 # vim /etc/pam.d/su 2)将用户添加到 wheel 组 # usermod -G w ...

  7. [AI] 论文笔记 - U-Net 简单而又接近本质的分割网络

    越简单越接近本质. 参考资料 U-Net: Convolutional Networks for Biomedical Image Segmentation Abstract & Introd ...

  8. windows10访问ftp中文乱码怎么办?

    windows10访问ftp中文乱码怎么办? 打开控制面板 选择时间和区域 选择更改数字格式 点击管理并点击更改系统区域设置 打勾

  9. Kotlin函数与Lambda表达式深入

    Kotlin函数: 关于Kotlin函数在之前也一直在用,用fun来声明,回忆下: 下面再来整体对Kotlin的函数进行一个学习. 默认参数(default arguments): 先来定义一个函数: ...

  10. 将照片转成base64时候,使用下面的这个包更加安全一些

    import org.apache.commons.net.util.Base64; 在项目中将照片转成base64时候,使用下面的这个包更加安全一些