Scala学习:Curry化的函数

在第1章,我们说过Scala允许你创建新的“感觉像是原生语言支持”的控制抽象。尽管到目前你已经 看到的例子都的确是控制抽象,不过任何人都不会误以为它们是原生语言支持的。为了搞明白如何让控 制抽象感觉更像语言的扩展,你首先需要明白称为curry化的函数式编程技巧。

curry化的函数被应用了多个参数列表,而不是仅仅一个。代码9.2展示了一个规整的,未被curry化 的函数,它实现两个Int型参数,x和y的加法。

scala> def plainOldSum(x: Int, y: Int) = x + y  
plainOldSum: (Int,Int)Int  
scala> plainOldSum(1, 2)  
res4: Int = 3

代码 9.2 定义和调用“陈旧的”函数

相对的,代码9.3展示了curry化后的同一个函数。代之以一个列表的两个Int参数,你把这个函数应 用于两个列表的各一个参数。

scala> def curriedSum(x: Int)(y: Int) = x + y  
curriedSum: (Int)(Int)Int  
scala> curriedSum(1)(2)  
res5: Int = 3

代码 9.3 定义和调用curry化的函数

这里发生的事情是当你调用curriedSum,你实际上背靠背地调用了两个传统函数。第一个函数调用带 单个的名为x的Int参数,并返回第二个函数的函数值。第二个函数带Int参数y。下面的名为first的函数 实质上执行了curriedSum的第一个传统函数调用会做的事情:

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

在第一个函数上应用1——换句话说,调用第一个函数并传入1——会产生第二个函数:

scala> val second = first(1)  
second: (Int) => Int = < function>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 函数
, 参数
, scala
, 两个
, 一个
currying
,以便于您获取更多的相关知识。

时间: 2024-08-30 11:09:53

Scala学习:Curry化的函数的相关文章

JavaScript高级程序设计(第3版)学习笔记9 js函数(下)_基础知识

再接着看函数--具有魔幻色彩的对象. 9.作为值的函数 在一般的编程语言中,如果要将函数作为值来使用,需要使用类似函数指针或者代理的方式来实现,但是在ECMAScript中,函数是一种对象,拥有一般对象具有的所有特征,除了函数可以有自己的属性和方法外,还可以做为一个引用类型的值去使用,实际上我们前面的例子中已经有过将函数作为一个对象属性的值,又比如函数也可以作为另一个函数的参数或者返回值,异步处理中的回调函数就是一个典型的用法. 复制代码 代码如下: var name = 'linjisong'

机器学习(三)--- scala学习笔记

 Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性.    Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法. 一.sca

jQuery学习笔记之回调函数_jquery

1.回调函数定义 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,才会真正的执行回调函数内部的方法. 2.代码 JS代码 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opacity:0.1

scala 学习笔记(07) 一等公民的函数

在scala中一切皆对象,一切皆函数,函数跟Int,String.Class等其它类型是处于同等的地位,换句话说,使用函数跟使用普通的类型一样,没什么区别,因此: 1.函数可以赋值给变量,可以当参数传递 def helloWorld(msg: String): Unit = { println("Hello," + msg) } def foo = { println("foo") } def main(args: Array[String]) { //函数赋值给变

scala 学习笔记(01) 函数定义、分支、循环、异常处理、递归

package yjmyzz import scala.io.StdIn object ScalaApp { def main(args: Array[String]) { println("please input something,press Enter to exit:") //每一行最后加不加分号都可以 readKeyboard //注:无参数的函数调用,加不加括号都行 println(add(1, 2) + "\n------\n") println(d

scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person { var name: String = _ /** * 从构造器 * @param name */ def this(name: String) = { this //注意:从构造器,必须先调用主构造器 this.name = name; } override def toString = { "

Scala学习笔记

1类型自动匹配(模式匹配) 2函数是有值的(匿名函数是函数的常态) 递归函数需要指定返回值 3.内部类隶属于外部类的实例本身,而java内部类属于外部类,对外部类的依赖路径依赖 4.object类似于java中的静态内部类 里面的所有成员都是静态的,适用于配置文件 静态都是用来修饰类的内部成员的.比如静态方法.静态成员变量.它唯一的作用就是随着类的加载(而不是随着对象的产生)而产生,以致可以用类名+静态成员名直接获得.这样静态内部类就可以理解了,它可以直接被用 外部类名+内部类名 获得. 5.同

Scala 学习笔记(转)

问题描述 scala是以实现scaleablelanguage为初衷设计出来的一门语言.官方中,称它是object-orientedlanguage和functionallanguage的混合式语言.并且,scala可以和java程序无缝拼接,因为scala文件编译后也是成为.class文件,并且在JVM上运行.不过,我更关心的是它的scaleable(扩展性).一门语言到底怎样才算有扩展性呢?对语言而言什么是它的扩展性呢?个人拙见,认为语言的扩展性可能包括两个方面:1.语言本身的扩展性2.由此

Scala 学习

1.强类型语言 弱类型语言 强类型语言:定义对象或变量时,需要指定其归属类型 一旦一个变量类型确定,它所归属的类型不可再变 弱类型语言:定义变量时不用指定变量类型 在程序运行中,可以改变变量的的归属类型 scala变量定义: var str = "abcd" java: String str = "abcd" 这样写法不是没有指定str的类型,而是没有显式的指定str的类型,它隐式的从变量值中自动判断 显式写法: var str:String = "abc