6.7.3 实现列表函数

刚才我们看到的筛选和映射函数,没有展示如何实现,现在,我们要看一个在第三章开始创建的函数。因为所有的列表处理函数都有类似的结构,看过下面的示例以后,实现其他任何函数也是可能的。

在第三章,我们写的函数,能够计算列表中的所有元素的和或积;随后,我们就意识到它可能比开始所表现的更有用:我们看到,它还能用来查找最小或最大元素。那时,我们没有讨论过泛型,因此,函数只处理整数。在清单 6.22 中,有一个类似的函数,没有类型批注,原始约束自动泛型化。

清单 6.22 泛型列表聚合 (F# Interactive)

> let rec fold f init list =

match list with

|[] –> init

|head::tail –>

let state = f init head

fold f state tail

;;

val fold : (‘a -> ‘b -> ‘a) -> ‘a-> ‘b list -> ‘a    [1] <-- 显示的类型签名

这个实现非常像第三章的;更重要的是,我们去掉了类型批注,因此,推断的签名更通用[1]。现在函数参数列表值的类型为 ‘b,聚合产生的值可以有不同类型(类型参数为 ‘a)。处理函数的参数值为当前的聚合结果(类型为 ‘a),和列表(‘b)中的一个元素,返回一个新的聚合的结果。

我们很快会看到,使用泛型使聚合更有用;在 F# 库中也有,处理不可变 F# 列表类型的版本位于 List 模块。下面的代码片断显示了原来第三章中的用法,计算列表中所有元素的积:

> [ 1 .. 5 ] |> List.fold (*) 1

val it : int = 120

由于将要处理泛型函数,编译器必须首先推断出类型参数的类型。这里,我们处理的是整数列表,所以,参数 ‘b 是 int,结果也是整数,所以 ‘a 也是 int。清单 6.23 显示其他一些使用 fold 的例子。

清单 6.23 使用 fold 的示例 (F# Interactive)

> places |> List.fold (fun sum (_,pop) -> sum + pop) 0;;    [1]

val it : int = 9080788

> places |> List.fold (fun s (n, _)-> s + n + ", ") "";;   [2]

val it : string =

"Seattle, Prague, New York,Grantchester, Cambridge, "

> places

|> List.fold (fun (b,str) (name, _) –>    [3]

let n = if b then name.PadRight(20) else name + "\n"

(not b, str+n)

) (true, "")    <-- 指定初始元组值

|> snd    [4]

|> printfn "%s";;   <-- 输出格式化后的字符串

Seattle Prague

New York Grantchester

Cambridge

在所有示例中,我们使用的都是我们定义的有关城市信息的集合,因此,列表的类型都相同。这样,参数 ‘b 的实际类型总是 (string * int) 元组;然而,聚合的结果不同。第一种情况[1],我们只计算人口的和,因此,结果的类型是 int;第二个示例[2],我们要构建有城市名字的字符串,因此,用空字符串开始聚合。lambda 函数作为第一个参数值,追加当前处理的城市名字和分隔符。

在最后一个示例中[3],我们实现的版本改进了格式,将城市名字分成两列,因此,lambda 函数执行两个交替操作。第一种情况,用空格填充名字(填充第一列),第二种情况,则将添加换行符(以结束行)。这是通过使用 bool 类型的临时值完成的,最初设置为 true,然后,在每次迭代时切换。聚合后的值包含了交替的临时值和结果字符串,因此,在结束时,需要从元组中删除临时值。

时间: 2024-10-12 13:10:21

6.7.3 实现列表函数的相关文章

Sass函数--列表函数

列表函数简介 列表函数主要包括一些对列表参数的函数使用,主要包括以下几种: length($list):返回一个列表的长度值: nth($list, $n):返回一个列表中指定的某个标签值  join($list1, $list2, [$separator]):将两个列给连接在一起,变成一个列表: append($list1, $val, [$separator]):将某个值放在列表的最后: zip($lists…):将几个列表结合成一个多维的列表: index($list, $value):返

python列表函数和方法

Python列表函数和方法 python列表中主要有以下函数: cmp(list1,list2)    比较两个列表的元素 len(list)           列表元素的个数 max(list)           返回列表元素的最大值 min(list)           返回列表元素的最小值 list(seq)           将元组转换成列表 ---------------------------------我是华丽的分割线----------------------------

10天精通Sass 之 Sass列表函数

列表函数主要有: length($list):返回一个列表的长度值: nth(list,n):返回一个列表中指定的某个标签值 join(list1,list2, [$separator]):将两个列给连接在一起,变成一个列表: append(list1,val, [$separator]):将某个值放在列表的最后: zip($lists-):将几个列表结合成一个多维的列表: index(list,value):返回一个值在列表中的位置值. length($list)返回一个列表的长度值 .spa

可变参数列表函数实现

如题 我们在写可变参数列表函数之前,先来了解一下什么是可变参数列表函数. 我们在c语言编程中有时会遇到 一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf(const char* format,-): 它除了有一个参数format固定以外,后面跟的参数个数和类型是可变的(用三个点"..."做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("%s",s); printf(

python 列表函数

list函数: 功能:将字符创转化为列表,例: 列表基本函数:  1.元素赋值,例: 注意:通过list[0]= 'hel',如果原来位置上有值,会覆盖掉原来的.  2.分片操作 1)显示序列,例: 注意:(1)list1[beg:end]将显示列表的从list1[beg]到list1[end-1]的元素,list1[end]不会显示 (2)list1[beg:end]省略beg,默认beg= 0; 省略end默认end = len(list1).因此list1[:]显示整个列表.  2)修改序

python笔记之列表函数和方法使用举例

在学习列表之前先了解了raw_input和input的区别:(仅适用于版本2,版本3中raw_input和input合并,没有raw_input) input的语法为:input("str"). raw_input函数把所有的输入当做原始数据保存为字符串格式: 而input默认用户输入为python的合法格式,用于字符串连接时有一定的局限性. 1.序列索引 python中序列索引有两种表达形式: (1)第一个元素索引是0,第二个是1,以此类推: (2)最后一个元素索引是-1,倒数第二个

6.7.2 理解列表函数的类型签名

前面提到过,我们使用函数来筛选和映射列表,都很直观.在本节,我们将看到它们的类型签名,知道只通过此信息,就可以推断出高阶函数能做什么. 当然,在一般情况下,不能从函数的类型就知道它能做什么,但对于泛型和高阶函数,例如那些用来处理列表的函数,通常是可能的.如我们前面所见的,处理泛型值的函数所做的不如单独处理值,因为,不能知道值的所有消息,因此,它们通常要有函数作为额外的参数值,它是用来处理这个值的. 函数的类型对结果如何使用,提供了一些线索.我们演示如何使用清单 6.20 中的类型签名. 清单 6

Python:列表函数

list函数: 将字符串转化成列表,例: >>> name = list('hello') >>> name ['h', 'e', 'l', 'l', 'o'] 列表基本函数: 1.改变列表:元素赋值 使用索引标记 >>>x = [1, 1, 1] >>>x[1] = 2 >>>x [1, 2, 1] 2.删除元素 del语句实现 >>>names = ['one', 'two', 'three']

WordPress分类列表函数:wp_list_categories用法及参数详解举例

http://www.511yj.com/wordpress-wp-categories.html 注意: 1. wp_list_categories() 和 list_cats() 以及 wp_list_cats() 的使用类似,但是后面 2 个已经弃用. 2.如果你希望不格式化输出分类,请使用 get_categories() 3.因为 WordPress 中内置扩展的小工具功能,所以我们不经任何函数就可以在边栏或是其他我们想要的位置显示一个分类列表,所以wp_list_categories