6.6.2 自己主动泛型化(automatic generalization)

在这一章,我们已经实现了几个 F# 的高阶函数。也看到了在 F# 和 C# 中并排的实现。F# 实现的非常重要方面,是我们根本不须要指定类型;这是因为有了自己主动泛型化(automatic generalization)。它用在判断函数声明的类型。我们将用Option.bind 函数的实现作为演示样例。介绍这个过程是怎样工作方法的:

let bind func value =   [1]

match value with    [2]

|None –> None     [3]

|Some(a) -> func(a)  [4]

1、我们将一步一步地描写叙述这个函数的类型判断过程。从最通用的可能类型開始。在处理代码中添加约束,这样。能够在清单中看到处理函数体时的过程。

2、使用声明签名[1]判断出 bind 是有两个參数的函数,为每一个參数值和返回类型分配新的类型參数:

func : 't1

value : 't2

bind : 't1 -> 't2 -> 't3

3、使用模式匹配[2]判断出 value 是选项类型,由于。它是根据Some 和 None 模式进行匹配的。

使用[3]判断出bind 的结果也是选项类型。由于,它可能有 None 值:

func : 't1

value : option<'t4>

bind : 't1 -> option<'t4> ->option<'t5>

4、使用[4]判断出 func 是函数,由于我们将用一个參数去调用:

func : ('t6 -> 't7)

value : option<'t4>

bind : ('t6 -> 't7) ->option<'t4> -> option<'t5>

5、 从[4]我们知道,函数的參数类型't4。与 bind 函数结果的类型同样。这样,我们能够加入以下两个约束:

't6 = 't4

't7 = option<'t5>

6、如今,我们可使用在上一步得到的约束。来替换类型 't6 和 't7 :

func : ('t4 -> option<'t5>)

value : option<'t4>

bind : ('t4 -> option<'t5>) ->option<'t4> -> option<'t5>

7、我们用 F# 的通常标准又一次命名类型參数:

bind : ('a -> option<'b>) ->option<'a> -> option<'b>

尽管,使用这种描写叙述实现 F# 类型判断算法是困难的,但它可以在判断高阶函数的类型时,了F# 可以使用何种信息。

在这个过程中最有重要的步骤。可能是判断用作參数的函数(func)类型。这个步骤之所以重要,是由于作为參数的函数表示可以在在值上进行的操作。

正如我们早些时候所见的,在某种意义上。这类似于方法,但由于有了类型判断,在 F# 中写这种代码,不须要不论什么额外的类型说明,并且代码还是全然类型安全的。

有关类型判断与自己主动泛型化的简短插曲之后。我们还要回到怎样编写和使用高阶函数上来。

在第五章,我们已经讨论了大部分类型,但仍缺少一个重要的函数式值类型;在下一节。我们将通过高阶函数处理列表,解决更熟悉的领域的问题。

6.6.2 自己主动泛型化(automatic generalization)的更多相关文章

  1. Java基础:泛型及其擦除性、不可协变性

    转载请注明出处:jiq•钦's technical Blog 1泛型语法: 泛型类: class ClassName<T>{} 泛型方法:public <T> void f(T ...

  2. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

  3. Java 泛型(Generics) 综述

    一. 引子 一般的类和方法.仅仅能使用详细类型:要么是基本类型.要么是自己定义类型.假设要编写能够应用于多种类型的代码,这样的刻板的限制对代码的束缚就会非常大. 多态算是一种泛化机制,但对代码的约束还 ...

  4. java为什么要用类型擦除实现泛型?--c++,java,c# 的泛型是如何实现的

    所以总结一下c++,java,c#的泛型.c++的泛型在编译时完全展开,类型精度高,共享代码差.java的泛型使用类型擦出,仅在编译时做类型检查,在运行时擦出,共享代码好,但是类型精度不行.c#的泛型 ...

  5. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  6. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  7. 浅析Java 泛型

    泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...

  8. Java总结篇系列:Java泛型

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...

  9. Java泛型

    什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...

随机推荐

  1. [Swust OJ 801]--Ordered Fractions

    题目链接:http://acm.swust.edu.cn/problem/801/ Time limit(ms): 1000 Memory limit(kb): 10000   Description ...

  2. BZOJ 3907: 网格( 组合数 + 高精度 )

    (0,0)->(n,m)方案数为C(n,n+m), 然后减去不合法的方案. 作(n,m)关于y=x+1的对称点(m-1,n+1), 则(0,0)->(m-1,n+1)的任意一条路径都对应( ...

  3. was服务器下修改jsp无效果

    使用了jsp静态导入,修改了导入的jsp页面,但是目标页面没出现效果.先说下静态导入和动态导入的区别: include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么J ...

  4. .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...

  5. 部署一个class文件

    只发布一个class文件找到项目工作空间/target/class..根据项目结构找到修改的java文件编译的class文件比如RegexUtils.class使用SecureFXPortable将文 ...

  6. python爬虫实战1

    转载于:http://blog.csdn.net/dongnanyanhai/article/details/5552431 首先推荐一个网站:中医世家,这个网站上有很多关于中医的资料,光是提供的中医 ...

  7. zoj p3780 Paint the Grid Again

    地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5267 题意:Leo 有一个N*N 的格子,他又有一把魔法刷,这个刷子能把 ...

  8. C 语言统计关键字出现次数

    #include <stdio.h> #include <ctype.h> #include <string.h> #define NKEYS (sizeof ke ...

  9. C语言,单链表操作(增删改查)(version 0.1)

    这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...

  10. 我的wifi

    首先利用百度查找 怎么承载网络,托管网络的用户名和密码 . 1.以管理员身份运行命令提示符: 快捷键win+R→输入cmd→回车 2.启用并设定虚拟WiFi网卡: 运行命令:netsh wlan se ...