1.3  Formulating Abstractions with Higher-Order Procedures

教材有时候依照学生的基础。从0讲起;有时候给出一个大图,然后具体地逐一介绍。

本文或同学们写学习笔记时。要依照后者进行归纳。

函数,是对一些数的复合操作,并且不依赖特定的数。如

(define (cube x) (* x x x))

它不针对某个数如3,而是对全部的參数数据求其立方。

由此。它是对

(* 5 5 5)

(* x x x) ; 这里x为实參

的抽象,而(* 5 5 5)等则编写为函数的应用( cube 5)。

注意,函数cube仅仅是将数作为參数。假设可以将函数作为还有一个函数的參数,会是一种什么场面呢?

函数是第一阶元素

编程语言一般会对其元素的使用方式。做出一些限制。而受到的限制最少的元素属于第一阶(first-class)

第一阶元素拥有的特权包含:

    用变量命名

    作为函数的參数

    由函数返回

    (能够包括在数据结构中)

Java的基本类型和引用类型。都是第一阶元素。可是。函数在Scheme中如同其基本数据类型一样,完全然全地是第一阶元素

所以,当把函数作为參数、返回值来使用的时候,就有了更高阶的函数。操作函数的函数即为高阶函数

在数学中。序列求和的sigma (∑)记法/符号,就是一个样例。

无论f(x)是什么。高阶函数∑求和。

假定我们有3个详细的求和函数。

1)sum-integers求代数和(从a到b)

(define (sum-integersa b)

(if (> ab)

0

(+ a(sum-integers (+ a 1) b))))

2)sum-cubes求立方和,

3)pi-sum依照公式

求出л/8.

(define (pi-sum a b)

(if (> ab)

0

(+ (/ 1.0 (* a (+ a 2)))(pi-sum (+ a 4) b))))

如今考虑设计一个高阶函数,表达∑符号。显然,除了參数a。b外,还须要指定∑中的项和变化规律,我们以term描写叙述∑中的项,而next描写叙述依照变化规律得到的下一项。则

(define (sum term next  a b) ;我喜欢a、b挨着

(if (> ab)

0

(+(term a)

(sumterm next (next a) b))))

定义的sum为∑求和这一高阶函数。

函数作为參数

高阶函数sum中,term和next都是函数形參,类似C的函数指针。如果我们在sum基础上定义求代数和。就须要提供term和next将要绑定的函数。

代数和的term,是一个恒等函数(identity),next是一个自增函数。

(define (identity x) x)

(define (inc n) (+ n 1))

于是,不须要单独定义sum-integers。而是应用高阶函数sum。得到sum-integers

(define (sum-integers a b)

  (sum identity inc a b))

(sum-integers 1 10)

另外。对于一次性的小函数,使用lambda表达式很紧凑。(在这里不是要点)

函数作为返回

高阶函数sum的返回值是一个数,高阶函数强大之处。能够将某些函数作为输入,而又返回一个函数——函数转换。



(define (transf f)

    (lambda(a)(+ a (f a)) ) )

(define (square x)

    (* x x) )

((transf square) 2)

函数transf的作用是对函数f进行平移,其返回值是由lambda定义的匿名函数。当将匿名函数应用到2时。得到的是2+f(2)。

函数的參数问题

高阶函数transf处理作为參数的函数f时,将它视为仅仅有一个參数的函数,如函数应用(f a)所暗示的。

可是作为參数的f,并没有说明这一信息。对于两个參数的op

(define (op x y)

    (* x y) )

将它应用到transf中是不应该的。解释器对于(transf op)的输出,为什么不是一个错误?当然。进一步应用会出错。

((transf op) 5) ;要2个參数

((transf op) 1 5) ;要一个參数

Scheme 4 Javaer-3.高阶函数的更多相关文章

  1. 【SICP归纳】2 高阶函数和数据抽象

    上一篇博文相应的是书中的第一章的一二两节,我们已经大致的有了一种构造的感觉不是么. 书中展示了非常多有趣的句法(syntax). 如今我们要让思想进一步的抽象.写这篇博客的时候并未学完整本书.更不敢说 ...

  2. c#语言-高阶函数

    介绍 如果说函数是程序中的基本模块,代码段,那高阶函数就是函数的高阶(级)版本,其基本定义如下: 函数自身接受一个或多个函数作为输入. 函数自身能输出一个函数,即函数生产函数. 满足其中一个条件就可以 ...

  3. swift 的高阶函数的使用代码

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  4. JavaScript高阶函数

    所谓高阶函数(higher-order function) 就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数. 下面的例子接收两个函数f()和g(),并返回一个新的函数用以计算f(g ...

  5. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  6. python学习道路(day4note)(函数,形参实参位置参数匿名参数,匿名函数,高阶函数,镶嵌函数)

    1.函数 2种编程方法 关键词面向对象:华山派 --->> 类----->class面向过程:少林派 -->> 过程--->def 函数式编程:逍遥派 --> ...

  7. Scala的函数,高阶函数,隐式转换

    1.介绍 2.函数值复制给变量 3.案例 在前面的博客中,可以看到这个案例,关于函数的讲解的位置,缺省. 4.简单的匿名函数 5.将函数做为参数传递给另一个函数 6.函数作为输出值 7.类型推断 8. ...

  8. Python之路 day3 高阶函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 变量可以指向函数,函数的参数能接收变量, 那么 ...

  9. JavaScript高阶函数 map reduce filter sort

    本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 高阶函数            一个函数就接收另一个函数作为参数,这种函数就称之为高阶函数          1.高阶函数之map:   ...

随机推荐

  1. python3-开发进阶Flask的基础

    一.概述 最大的特点:短小精悍.可拓展强的一个Web框架.注意点:上下文管理机制,依赖wsgi:werkzurg 模块 二.前奏学习werkzurg 先来回顾一个知识点:一个类加括号会执行__init ...

  2. [ARC051D]長方形

    [ARC051D]長方形 题目大意: 给定\(A_{1\sim n}\)和\(B_{1\sim m}(n,m\le2000,|A_i|,|B_i|\le10^5)\),矩阵\(C_{i,j}=A_i+ ...

  3. poj 1733 并查集+hashmap

    题意:题目:有一个长度 已知的01串,给出多个条件,[l,r]这个区间中1的个数是奇数还是偶数,问前几个是正确的,没有矛盾 链接:点我 解题思路:hash离散化+并查集 首先我们不考虑离散化:s[x] ...

  4. Java容器-引入Guava类库

    目录 1.只读设置 2.函数式编程+组合式编程 3.约束条件 4.集合操作(并集.差集.交集) 代码实现 1.只读设置 public static void main(String [] args){ ...

  5. 蓝屏代码详解(更新WIN7蓝屏代码)

    6位代码含意 0 0x0000 作业完成.  1 0x0001 不正确的函数.  2 0x0002 系统找不到指定的档案.  3 0x0003 系统找不到指定的路径.  4 0x0004 系统无法开启 ...

  6. OC利用正则表达式获取网络资源(网络爬虫)

    在开发项目的过程,很多情况下我们需要利用互联网上的一些数据,在这种情况下,我们可能要写一个爬虫来爬我们所需要的数据.一般情况下都是利用正则表达式来匹配Html,获取我们所需要的数据.一般情况下分以下三 ...

  7. Inverted bipolar transistor doubles as a signal clamp

    A number of circuits, such as level detectors and AM demodulators, benefit from a rectifier with a l ...

  8. Linux/drivers/usb/serial/ftdi_sio.c

    Linux/drivers/usb/serial/ftdi_sio.h /* 2 * Driver definitions for the FTDI USB Single Port Serial Co ...

  9. Struts2 include(包含)多个配置文件

    Struts 2自带有“包含文件”功能,包含多个Struts配置文件合并为一个单元. 单个Struts配置文件 让我们来看看一个糟糕的 Struts 2 配置示例. struts.xml <?x ...

  10. Ubuntu 11.04安装GCC 4.6.1

    首先下载相应的源代码:ftp://ftp.dti.ad.jp/pub/lang/gcc/releases/gcc-4.6.1/#下载 gcc-4.6.1.tar.bz2 ftp://ftp.dti.a ...