12.5.1 声明计算类型

在这个示例中,计算的类型(在 Haskell 术语中的单子类型)称为 ValueWrapper<T>,它只是存储泛型类型参数T 的值,并不会为类型增加任何其他功能。这就是说,计算只处理标准值,但是,我们能够用 C# 中的查询表达式, F# 中的计算表达式,写代码(来增加功能)。

清单 12.17 显示了在 C# 和 F# 中的类型声明。在 C# 中,我们创建简单的类,在 F# 中,将使用一个简单的只有一种情况的差别联合。

清单 12.17 C# 和 F# 中的计算值

// C# 的类声明

class ValueWrapper<T> {

public ValueWrapper(T value) {

this.Value = value;

}

public T Value { get; private set; }    [1]

}

// F# 的差别联合类型

type ValueWrapper<‘a> =

| Value of ‘a    [2]

C# 的类是一个简单的不可变类型,存储了类型 T的值[1]。在 F# 中,使用了只有一个分支的差别联合,也很重要,它可以创建命名类型,以方便使用。我们很快就会看到,可以使用模式匹配(用 Value 识别器)就能访问这个值。有这个类型的模式匹配,永远也不会失败,因为只有一个分支,因此,可以直接在值绑定的内部使用,这在实现计算的算法时,非常有用。首先,我们看一下,用这种新类型能够写出什么种类的计算。

时间: 2024-09-29 07:06:14

12.5.1 声明计算类型的相关文章

C++ Primer学习总结 第1-2章 变量和基本类型

第1-2章 变量和基本类型 1.下面这个语句在C++98和C++11中的输出结果不同. C++98结果: (如果想要更高的精度,可以用%.9lf,输出9位有效数字) C++11结果: 结论: printf的%lf在C++11中表示longdouble,所以用中%f就可以输出float和double类型.而printf在C++98中可以用%lf正确输出double. 如果是scanf的话,不论C++98还是C++11中float都用%f读取,double都用%lf读取,因为二者结构不同.   2.

12.5.2 写计算

C# 查询表达式和 F# 计算表达式,可以使用函数,行为方式非标准(返回单子值),就好像返回普通值.我们在这一节使用的计算类型是 ValueWrapper <T>,因此,原始函数将返回值的类型是 ValueWrapper<T>,而不是 T. 实现这些函数,既可以使用其他的查询或计算表达式,也可以通过直接创建计算类型的值.有些计算表达式可以封装复杂的逻辑,所以,直接创建值可能有困难.这时,通常写一些返回这种计算类型的基本操作,再使用这些基本操作实现其他的一切.然而,构建 ValueW

关于typedef声明新类型名

typedef作用是用简单的类型名代替复杂的类型名,这样易于理解,方便表示.如 typedef int Integer 指定Integer为类型名,作用于int 相同 Integer i 与 int i 等价. 复杂点的情况是定义函数指针,如 typedef void (*fun)(void) 表示用户自己定义了一个函数指针数据类型,fun ptr,即定义了一个函数指针ptr,可将函数地址赋给该指针,如 ptr=File; (File为一函数,函数名即地址,File()的入口地址赋给ptr,以后

declare声明变量类型

1.declare声明变量类型 [[email protected] ~]# declare [+/-][选项] 变量名 选项: -:    给变量设定类型属性 +:   取消变量的类型属性 -i:   将变量声明为整数型(integer) -x:    将变量声明为环境变量 -p:    显示指定变量的被声明的类型 例如:#export aa #declare -p aa 查询变量 aa变成 2.数值运算-方法1  [[email protected] ~]# aa=11 [[email pr

zabbix低级发现添加计算类型的key值注意问题

在使用zabbix的低级发现功能添加一个计算类型的key值时,需要将低级发现的宏变量也添加进去 key值如下: used_connections_percentage_discovery[{#MONGO_HOST}] 注意这里是用[{#MONGO_HOST}] 如果不添加这个那么添加后的key值会报重复添加错误

zendstudio 声明变量类型,让变量自动方法提示

zendstudio 行内注释, 显式声明变量类型,让变量自动方法提示 $out = []; /* @var $row \xxyy\SizeEntity */ foreach ($rows[ 'list'] as $row) { $out[ 'list'][] = [ 'width' => $row->getWidth(), 'height' => $row->getHeight(), ]; } $out = []; /* @var $invoice ChargeInvoice *

12.7.3 使用计算表达式进行重构

在前一章,我们讨论过重构函数式程序的方法,最后一个主题是延迟性,它变改代码的执行方式,而不影响程序的结果.从某种意义上讲,添加延迟性也可看作是一种重构技术:计算表达式的类似之处在于,增加额外的代码,但不改变核心意思. 提示 在计算表达式和延迟性之间有密切的关系,使用 Lazy<'T> 计算类型,创建能够把代码转换成延迟计算的计算表达式,是有可能的.我们可以尝试实现自定义的计算,唯一的难度在于写 Bind 成员.在这里,我们不进行讨论,在本书的网站上可以找到其他的信息. 重要性在于,把标准的 F

C编译器剖析_4.4 语义检查_外部声明_类型结构的构建(2)

在这一小节中,我们将对形如第3章图3.3.17所示的结构体语法树进行语义检查,从而构建结构体的类型结构. 图3.3.17 ParseStructOrUnionSpecifier()构建的语法树 我们在第2章中给出了以下结构体struct Data对应的类型结构,如图2.4.4所示.为了阅读方便,我们重新给出这2幅图,由图示我们也能较清楚地预览本节的起点和终点. struct Data{ int abc:8; int def:24; double f; } dt; 图2.4.4   结构体的类型结

C++ 声明新类型 typedef

在C++中,除了可以声明结构体.共用体.枚举等类型外,还可以用typedef声明一个新的类型名来代替已有的类型如: typedef int INTEGER;  //指定用标识符INTEGER代表int类型 typedef float REAL;  //指定用REAL代表float类型 这样,以下两行等价: int i,j; float a,b; INTEGER i,j; REAL a,b; 这样可以使熟悉FORTRAN的人能用INTEGER和REAL定义变量,以适应他们的习惯. 如果在一个程序中