Scala函数柯里化(Currying or Curry)

柯里化(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(3)("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(3) //验证返回类型,确实是个函数
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(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(3)("ScalaA")
res2: String = ScalaAScalaAScalaA

原文地址:https://www.cnblogs.com/luengmingbiao/p/11216319.html

时间: 2024-11-13 06:57:37

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

函数柯里化(Currying)示例

”函数柯里化”是指将多变量函数拆解为单变量的多个函数的调用, 可以从高元函数动态地生成大量低元的函数.可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力.下面给出了一个示例,说明如何使用 Currying 用一行代码计算任意指数的多项式的和: 以及使用 Currying 实现一个简单的文件处理框架. 注意到, Currying 的过程中,参数的顺序是有讲究的.一般, 函数参数建议放在前面,按照想要调用的顺序: 数据参数放在后面. package scalastudy.basic

Swift函数柯里化(Currying)简谈

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化简单的说就是把接收多个参数的函数划分为若干个"嵌套"的单一参数的函数. 这样说谁也听不懂,我们结合一个例子给大家简单说说. 我们需要定义一个函数A,该函数返回一个函数B,函数B创建一只大蜘蛛.为什么要间接返回大蜘蛛,因为本猫最怕大蜘蛛,所以不敢直接返回大蜘蛛 ;) 首先是蜘蛛的类: class Spider:C

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

前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细介绍函数柯里化(curring) 定义 currying又称部分求值.一个currying的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来.待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值 从

JS中的柯里化(currying)

何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果.因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程. 柯里化一个求和函数 按照分步求值,我们看一个简单的例子 var concat3Words = function (a

建议75:函数柯里化

柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新函数,这个新函数能够接受原函数的参数.下面可以通过例子来帮助理解.function adder(num) {    return function(x) {        return num + x;    }}var add5 = adder(5);var add6 = adder(6);print(add5(1));  // 6print(add6(1));  //7 函数adder接受一个参数,并返回一个函数,这个返

【转载】JS中bind方法与函数柯里化

原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情况戳这里ECMAScript 5 compatibility table),权威指南上提到在ES3中利用apply模拟该方法的实现(JS权威指南中函数那章), 但无法真实还原该方法, 这也是真bind方法中的有趣特性. (原文这边理解有问题, 这段话的意思如果结合犀牛书上下文的意思, 再结合犀牛书中

js高阶函数应用—函数柯里化和反柯里化

在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个只有一个参数的函数,而这个函数返回一个带参数的函数,这样就实现了能写两个参数的函数了(具体参见下边代码)--这就是所谓的柯里化(Currying,以逻辑学家Hsakell Curry命名),也可以理解为一种在处理函数过程中的逻辑思维方式. 1 function add(a, b) { 2 retur

【转】详解JS函数柯里化

第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了解了后才发现其实就是高阶函数的一个特殊用法.果然是不管作用怎么样都要有个高端的名字才有用. 首先看看柯里化到底是什么? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 看这个解释有一点抽象,我们就拿被做了无数次示例的add函数,

浅谈函数柯里化

关于函数柯里化的定义,我摘抄一段来自百度百科的原话:在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术. 这段话听起来可能有一些抽象,但是如果用实际例子来解释可能会帮助我们更好地理解何为函数柯里化.看看下面这个问题,是一道前端面试中常考的题: 如何实现add(2)(3)(4) = 9 当我第一次看到这个题目的时候我就在思考,add(2)后面为什么还能带(3)(4)呢?是不是因为add