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. CButtonST的用法详解【转】

    在想使用CButtonST的工程中加入BtnST.h.BtnST.cpp.BCMenu.h.BCMenu.cpp4个文件.2个类. 1. 在按钮上加入Icon,使Icon和文字同时显示 假设按钮ID为 ...

  2. atexit模块解析

    atexit模块很简单,只定义了一个register函数用于注册程序退出时的回调函数,我们可以在回调函数中做一些资源清理的操作. 注意回调函数只有正常退出的时候才会调用,如果程序是被信号杀死或者因为严 ...

  3. Myeclipse代码提示及如何设置自动提示

    Myeclipse代码提示及如何设置自动提示 (2011-11-18 00:38:41) 转载▼ 标签: 杂谈 分类: Java 1. 设置代码自动提示window --> preference ...

  4. MVC+ADO模式

    MVC+DAO设计模式 博客分类: Java Java WEB开发   MVC+DAO设计模式 本文摘自:http://www.paper.edu.cn    基于MVC+DAO设计模式的Struts ...

  5. 进度记录 和 安装imagick时Cannot locate header file MagickWand.h错误的解决

    修改php.ini文件,已使php支持扩展的功能 [root@localhost imagick-2.2.2]# ./configure --with-php-config=/usr/local/ph ...

  6. HDU1163【九余数定理】【水题】

    Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  7. LeetCode——Path Sum II

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  8. 【Hibernate】set排序

    使用hibernate进行一对多操作的时候,普遍使用HashSet进行操作.但是HashSet是无序集合,对此可以使用TreeSet进行排序. 1.将HashSet改为TreeSet private ...

  9. listview 拖动item效果实现

    listview 拖动item效果实现 效果图如下: 拖拽前: 拖拽后: 首先参考源码中:TouchInterceptor 类,该类会在下面给出: 第一步:主类: /**  *   */ packag ...

  10. listview添加onItemClickListener

    MainActivity.java package com.wyl.listview04; import java.util.ArrayList; import java.util.HashMap; ...