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

前面提到过,我们使用函数来筛选和映射列表,都很直观。在本节,我们将看到它们的类型签名,知道只通过此信息,就可以推断出高阶函数能做什么。

当然,在一般情况下,不能从函数的类型就知道它能做什么,但对于泛型和高阶函数,例如那些用来处理列表的函数,通常是可能的。如我们前面所见的,处理泛型值的函数所做的不如单独处理值,因为,不能知道值的所有消息,因此,它们通常要有函数作为额外的参数值,它是用来处理这个值的。

函数的类型对结果如何使用,提供了一些线索。我们演示如何使用清单 6.20 中的类型签名。

清单 6.20 处理列表的函数和方法的签名 (F# and C#)

// F# function signatures

List.map : (‘a -> ‘b) -> ‘a list-> ‘b list       <--|

List.filter : (‘a -> bool) -> ‘a list-> ‘a list       |     <--|

[1]      |

// C# method declarations                 |      [2]

List<B> Select<A, B>(List<A>, Func<A, B>) <--|       |

List<A> Where<A>(List<A>, Func<A, bool>)        <--|

让我们先看映射[1]。可以发现,输入参数是类型为 ‘a 的值的列表,结果是类型为 ‘b 的值的列表。操作不会知道 ‘b 是什么,所以,它不能单独创建此类型的值;要创建类型 ‘b 的值,唯一的方法是使用作为参数值给定的函数,把类型为 ‘a 的值转换为类型为 ‘b 的值。这表明,操作能运行的唯一合理方法,是遍历输入列表中的值,对每个值调用函数,返回结果列表。事实上,这正是映射操作所做的事。

值得注意的是,在这种情况下,输入列表的类型和输出列表的类型可以不同。在第五章,我们在整数列表中加数字 10,因此,输入列表与输出列表的类型相同。我们可以使用函数,用数字参数值创建字符串;在这种情况下,输入列表是整数列表,而结果是字符串列表。

第二个操作中筛选[2]。这里,输入和结果的列表类型相同。作为参数给定的函数,是一个判断,对于类型为 ‘a 的值,返回 true 或 false,与输入列表中元素的类型相同。这给我们一个很好的启示,操作可能为列表中的每个元素调用这个函数,并根据结果确定是否应将该元素复制到返回列表中。

时间: 2024-10-14 19:27:21

6.7.2 理解列表函数的类型签名的相关文章

正确理解Python函数是第一类对象

正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性.那到底什么是第一类对象呢? 函数是对象 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性

理解python函数是第一类对象

转自:https://foofish.net/function-is-first-class-object.html.尊重原创,特此声明! ------------------------------------------------------------------ 正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数作为第一类对象(First

24.函数的类型

函数的类型 在 SQL 中,基本的函数类型和种类有若干种.函数的基本类型是: Aggregate 函数 Scalar 函数 合计函数(Aggregate functions) Aggregate 函数的操作面向一系列的值,并返回一个单一的值. 注释:如果在 SELECT 语句的项目列表中的众多其它表达式中使用 SELECT 语句,则这个 SELECT 必须使用 GROUP BY 语句! Scalar 函数 Scalar 函数的操作面向某个单一的值,并返回基于输入值的一个单一的值.

《Effective Modern C++》翻译--条款2: 理解auto自己主动类型推导

条款2: 理解auto自己主动类型推导 假设你已经读过条款1关于模板类型推导的内容,那么你差点儿已经知道了关于auto类型推导的所有. 至于为什么auto类型推导就是模板类型推导仅仅有一个地方感到好奇.那是什么呢?即模板类型推导包含了模板.函数和參数,而auto类型判断不用与这些打交道. 这当然是真的.可是没关系. 模板类型推导和auto自己主动类型推导是直接匹配的. 从字面上看,就是从一个算法转换到还有一个算法而已. 在条款1中.阐述模板类型推导採用的是常规的函数模板: template<ty

Sass函数--列表函数

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

c/c++: c++函数返回类型什么情况带const

c++ 函数的返回类型,包括const 什么时候起作用呢? 函数返回值不想其立即修改的. 例子如下,这是一个简单的避免产生隐形返回变量的方法,abc 的函数返回是引用,main函数中第10行,++ 操作是基于 const int & 类型,所以会出错,但以后对改引用的操作不会受到const 约束. 这样的好处是避免了函数返回值与操作符的逻辑错误结合,例如下面的例子中函数返回的++,对于main 函数是不直观的,进一步的应用是在操作符重载方面,见下一情况说明. 1 const int & a

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(

6.7.3 实现列表函数

刚才我们看到的筛选和映射函数,没有展示如何实现,现在,我们要看一个在第三章开始创建的函数.因为所有的列表处理函数都有类似的结构,看过下面的示例以后,实现其他任何函数也是可能的. 在第三章,我们写的函数,能够计算列表中的所有元素的和或积:随后,我们就意识到它可能比开始所表现的更有用:我们看到,它还能用来查找最小或最大元素.那时,我们没有讨论过泛型,因此,函数只处理整数.在清单 6.22 中,有一个类似的函数,没有类型批注,原始约束自动泛型化. 清单 6.22 泛型列表聚合 (F# Interact