6.6.2 自己主动泛型化(automatic generalization)
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)的更多相关文章
- Java基础:泛型及其擦除性、不可协变性
转载请注明出处:jiq•钦's technical Blog 1泛型语法: 泛型类: class ClassName<T>{} 泛型方法:public <T> void f(T ...
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...
- Java 泛型(Generics) 综述
一. 引子 一般的类和方法.仅仅能使用详细类型:要么是基本类型.要么是自己定义类型.假设要编写能够应用于多种类型的代码,这样的刻板的限制对代码的束缚就会非常大. 多态算是一种泛化机制,但对代码的约束还 ...
- java为什么要用类型擦除实现泛型?--c++,java,c# 的泛型是如何实现的
所以总结一下c++,java,c#的泛型.c++的泛型在编译时完全展开,类型精度高,共享代码差.java的泛型使用类型擦出,仅在编译时做类型检查,在运行时擦出,共享代码好,但是类型精度不行.c#的泛型 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- Java总结篇系列:Java泛型
一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...
- Java泛型
什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...
随机推荐
- LightOJ 1317
Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %lluDescription You probab ...
- XAlign - Xcode插件 - 对齐代码
链接地址:http://my.oschina.net/u/2473136/blog/520620 一款十分强大的自定义对齐模式插件 开源地址:https://github.com/qfish/XAli ...
- mysql存储过程详解[转]
1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...
- vs2010中iostream.h出错
使用 #include <iostream> using namespace std; 替代 VS2010删除了所有非标准库,保留了C++标准库,iostream.h是以前旧版的库,VS2 ...
- Java多线程实现......(1,继承Thread类)
MyThread.java 中的代码: public class MyThread extends Thread{ private int startPrint,printCount; private ...
- 深入浅出—JAVA(4)
4.方法操作实例变量
- bash:xxx:command not found
前几天在centos6.0上配好了oracle 10g并且能够执行oracle相关命令,但是今天准备往oracle里倒数据时,执行sqlplus 出现bash:command not found [o ...
- 在Github上搭建你的博客
title: blog on github date: 2014-03-24 20:29:47 tags: [blog,github,hexo] --- **用Github写博文** 参考http:/ ...
- 依赖于设备的位图(DDB) ,CreateCompatibleBitmap用法
DDB(Device-dependent bitmap)依赖于具体设备,这主要体现在以下两个方面: DDB的颜色模式必需与输出设备相一致.例如,如果当前的显示设备是256色模式,那么DDB必然也是25 ...
- Tilemill + tilestream + mapbox.js 自制地图
感谢Mapbox,带来了一整套完整的地图方案. 你可以把你的地图放在Mapbox的网站上.也可以使用他们提供的开源软件自己架设地图服务. Mapbox的地图方案包括web,ios和android. 不 ...