摘要: 用全局关联来支持矩阵我们的数字类型可以被用在一些标准的库函数如List.sum中,因为它们实现一些被List.sum必需的静态成员约束的成员。然而,这种方法对复杂的数据类型如泛型矩阵不工作。如果我们试图用我们的类型写任意矩阵计算,这将是不工作的,因为泛型矩阵类型不能自动的使用我们提供的重载操作符和成员。为了支持矩阵我们需要提供所谓的数值关联。它是个简单的接口,包含了我们的类型上能被执行的数值操作符号。这个接口需要被注册在被F# PowerPack库维护的全局表中,以使任何F# 代码能够从这个表中得到接口并用它来对我们的类型执行操作。F# PowerPack库包含了用一个层次表示的一系列接口,这 阅读全文
posted @ 2012-04-27 16:43 tryfsharp 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 交互地测试数字类型下一步,我们将用F#交互来验证我们所写的代码到目前为止是按预期工作的。在这一点上,我们甚至没有生成库。我们仅仅写了一些F#的源代码,想不生成库来测试这些源代码。我们将使用在F#脚本文件中写入的交互式测试。一旦你建立了库,就可以很容易地用NUnit,XUnit或者其他测试框架把它们转变成相应的单元测试。为了测试我们在源代码级别实现的类型,我们先添加一个新的名为Test.fsx的F#脚本文件(添加->新建项目->F#脚本文件)。在这个文件中,我们加载IntegerZ5.fs的内容并注册一个打印机以指定F#交互工具应该如何输出我们的类型的值:1: #load " 阅读全文
posted @ 2012-04-27 16:29 tryfsharp 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 本章中,我们定义用于模算术运算[1](也称为时钟运算)的F#数字类型。模算术用于当我们想保留一个通过循环计算在指定范围内的值。例如,时钟的最大值为12小时。当我们将11小时和3小时相加的时候,数值会溢出,结果就为2小时。且别说时钟,这种数字系统对密码学,音乐等也是必需的。本文介绍了几种在F#中定义任何新的数字类型时必不可少的技术。更重要的是,你将学会如何::: 用重载运算符定义一个数字类型:: 为构造我们的新数字类型而定义一个数字文本:: 使在F#链表和矩阵中用我们的类型进行计算成为可能:: 隐藏数字类型的实现细节我们定义类型IntegerZ5实现模运算的模5,也就是说有效值的范围是从0到4, 阅读全文
posted @ 2012-04-27 16:23 tryfsharp 阅读(296) 评论(0) 推荐(0) 编辑