Thinking in scala (6)----高阶函数----返回一个函数
在Thinking in scala (5)----高阶函数* 里面,我们演示了如何把一个函数作为参数传递给另外一个函数。
在本文里面,我们来演示函数式编程另外一个重要的特性:返回一个函数。首先来看这么一段代码:
code piece 1:
def sum(f:Int=>Int):(Int,Int)=>Int={ def sumF(a:Int,b:Int):Int= if(a>b) 0 else f(a)+sumF(a+1,b) sumF }
一点点来看,f:Int=>Int 是sum函数接收的参数,该参数是一个函数。
":" 号后面的 (Int,Int) => Int 是sum函数的返回值,又(Int,Int) => Int是一个函数的类型:接收两个Int型的数,
返回一个Int的数。也就是说调用sum函数,其返回的值是一个函数。 这一点对于已经习惯C、C++、Java等编程语言的
程序员来说有一点难以理解。
继续看例子吧,如果执行下面的一行代码会发生什么呢?
sum(x=>x*x)(1,4)
结果会返回30。为什么是30呢? 30= 1^2+ 2^2 + 3^2 + 4^2.
首先,sum(x=>x*x) 是一个函数,并且sum(x=>x*x)的类型是(Int,Int)=>Int,正因为sum(x=>x*x)是一个函数,
所以它才可以继续接收参数(1,4).
好吧,我可能没有把这个事儿说清楚,实在是太抽象了。但是,读者应该有了一个基本的印象,那就是:
在函数式编程里面,函数f可以接收函数g作为参数,也可以返回函数h。
到这里还没完。。。。。。
Scala里面可以继续对code piece1 进行简化,如下:
code piece2:
object higherorderfuntion{ def sum(f:Int=>Int)(a:Int,b:Int):Int={ if(a>b) 0 else f(a)+sum(f)(a+1,b) } def fac(a:Int):Int= { def loop(a:Int,acc:Int):Int= if(a==0) acc else loop(a-1,a*acc) loop(a,1) } def main(args:Array[String])={ println(sum(x=>x)(1,4)) println(sum(x=>x*x*x)(1,4)) println(sum(fac)(1,4)) } }
这里我们需要特别注意,这里sum函数的参数列表变成了两个:(f:Int=>Int)和(a:Int,b:Int)
在scala里面,函数可以有多个参数列表。比如下面的函数定义:
def f(args_1)(args_2)...(args_n)=E
E代表一个函数体,且n>1
那么上述定义等价于:
def f(args_1)(args_2)...(args_n-1)={def g(args_n)=E;g}
还是以code piece2中的sum函数为例:
def sum(f:Int=>Int)(a:Int,b:Int):Int={ if(a>b) 0 else f(a)+sum(f)(a+1,b) }
等价于:
def sum(f:Int=>Int):(Int,Int)=>Int={ def g(a:Int,b:Int):Int = if(a>b) 0 else f(a)+sum(f)(a+1,b) g }
这个定义和code piece1中的sum函数的定义是一致的。
Thinking in scala (6)----高阶函数----返回一个函数的更多相关文章
- Thinking in scala (5)----高阶函数*
高阶函数是函数式编程里面一个非常重要的特色,所谓的高阶函数,就是以其它函数作为参数的函数. 下面以一个小例子演示Scala的高阶函数特性,非常有意思,也非常强大. 首先看这么一个程序: code1: ...
- 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签
今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...
- Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值
第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列
11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...
- Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型
11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...
- 【转载】让c++ 函数返回一个数组
在c++中是不允许数组作为函数的返回值的 int [] someFunction( ); //ILLEGAL 要想实现函数返回一个数组,那返回对应数组里面类型的指针 you must return a ...
- Python--遍历文件夹下所有文件和目录的方法(os.walk(rootdir)函数返回一个三元素元祖)
import os import os.path # This folder is custom rootdir = '/Users/macbookpro/Desktop/test' for pare ...
- array_flip() 函数返回一个反转后的数组
定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数据类型不是字符串或整数,函数将报错 ar ...
- scala面向对象.高阶函数,柯里化,Actor编程简介
1.定义一个类 class Person{ //用val修饰的变量是只读属性,有getter但是没有setter val id ="111" //用var修饰的变量既有getter ...
随机推荐
- linux和windows之间上传 下载文件 非ftp方式
用 命令 rz 上传 sz 下载 文件夹加上 -r rz上传替换时用 -y 谁用谁知道 两台linux传 : scp -r 文件夹 username@ip:路径 (如果传输文件就 ...
- android:editable is deprecated: Use an <EditText> to make it editable
问题:android:editable is deprecated: Use an to make it editable 意思:Android的:编辑是反对:使用<</span> ...
- hdu_5720_Wool(脑洞)
题目连接:hdu_5720_Wool 题意: 给你N个数,然后给你一个区间,问你在这个区间内有多少数可以不与这N个数任选两个出来组成三角形 题解: 这里我还是贴官方的题解算了 考虑三角形三条边a,b, ...
- 属性动画ValueAnimator用法
用法举例: 1. ValueAnimator animator = ValueAnimator.ofInt(0,100);//定义animator 2. animator.addUpdateListe ...
- 以前的loginUI
的 <%@ page language="java" pageEncoding="UTF-8"%> <%@ include file=&quo ...
- javascript 按位或(|),无符号右移(>>>)运算,组合技巧来实现————密码强度提示,四种情况??
直接上代码,原来的代码中,switch中的第一个case,判断之后,少加了个break 跳出判断语句,害得我查了半天,“怎么样式老是不对,不科学啊,呵呵,原来是没跳出case的判断了,还会执行后面的判 ...
- android脚步---如何看log之程序停止运行,和UI线程和非UI线程之间切换
经常运行eclipse时,烧到手机出现,“停止运行”,这时候得通过logcat查log了.一般这种情况属于FATAL EXCEPTION,所以检索FATAL 或者 EXCEPTION,然后往下看几行 ...
- cmd 3389
1.2000系统 简要说一下如何进行DNS溢出攻击.我用的溢出利用程序是dns.exe,在CMD下运行它可以看到它的使用参数等信息.执行"dns -s IP"命令检测目标IP是否存 ...
- bootstrap-table 表头和内容对不齐解决办法
偶然机会学习bootstrap,表格利用bootstrap-table实现,使用bootstrap-table过程中,发现了一个非常棘手的问题,在ie浏览器中,表格的表头和内容对不齐,特别是列比较多且 ...
- 考分鄙视(exam)
考分鄙视(exam) 题目描述 Whence这个学期考了n次试,每一次都有一个0-20000之间的整数分数.Whence本来的状态应该是每一次考试都比前一次多一分(除第一次),但由于他很不稳定,偏差可 ...