摘要: 首先,NULL对于F#类型来说是不允许的值,这在某种意义上是好的,但是由此也带来了麻烦。第一个需要可能是:忘记所有关于option和NULL的参数,我需要NULL,那是我编程的方式。那么好。你可以使用你允许它为NULL的类型的[<AllowNullLiteral>]特性。真正走进F#的人们同意使用option是一个更好的选择。然而,这种限制使F#很难和C#程序交流。例如,你想从C#里面使用F#库。你真的能够禁止C#用户设置NULL值进入你的完美世界?或者,你应该吗?我想保持我的世界不受影响且让其他的人继续他们的方式,而不是成为一个编码警察和强迫每个人。我将使用一个属性来筛选传入的N 阅读全文
posted @ 2012-05-24 11:50 tryfsharp 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 我在Visual Studio论坛上读过一个很有趣的论坛帖子,内容大致是这样的:当试图测试一个obj对象是否是一个空的list,我们不能用模式匹配的类型测试来达到目的,具体代码如下:1 let empt (o: obj) =2 match o with3 | :? List<'a> as l when l.IsEmpty -> true4 | _ -> false编译器会报一个警告:warning FS0064: This construct causes code to be less generic than indicated by the type an 阅读全文
posted @ 2012-05-17 10:22 tryfsharp 阅读(1567) 评论(2) 推荐(0) 编辑
摘要: 用全局关联来支持矩阵我们的数字类型可以被用在一些标准的库函数如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) 编辑
摘要: Visual Studio 11 Beta现在已经可以下载了!这个版本包含F# 3.0的Beta版,此F# 3.0介绍了F#信息富态编程。Beta版本发布了一些新的F#特性,包括:可移植库支持,加强的Type Providers,改善的智能感应,以及支持任意CPU的FSI版本。 阅读全文
posted @ 2012-03-31 15:55 tryfsharp 阅读(355) 评论(0) 推荐(0) 编辑
摘要: 其他矩阵操作我们将简单的介绍一些F# PowerPack中提供的关于矩阵的有用的函数与操作符用来总结这部分内容。下面的列表给出了一组相似函数的使用示例。逐点操作Matrix.cptMax Matrix.cptMin Operators: + and .*matrix -> matrix -> matrix这些函数与操作对作为参数传入的两个矩阵的对应元素执行位操作并将结果作为一个矩阵返回。函数cptMax和cptMin分别返回矩阵中最大与最小的元素,+ 执行加操作,.*则执行乘操作。注意:操作*是用在矩阵乘法上。逻辑聚合Matrix.forall Matrix.exists(floa 阅读全文
posted @ 2012-03-21 16:24 tryfsharp 阅读(336) 评论(0) 推荐(0) 编辑
摘要: 使用矩阵Matrix是一种可变类型,因此它可以在创建后被修改。当你必须要修改矩阵式,最好的方法就是一次性的修改,修改后将之视为不可变的(例如:当矩阵作为函数结果被返回时,而此函数是使用可变性来实现的)。这样的话,你会在构造是得到好的性能,同时你可以保持代码的其余部分透明地引用它。用序号访问矩阵元素下面的代码展示了直接创建一个4x4的邻接矩阵的方法,此邻接矩阵来自于本文介绍部分所讨论的表示图的两个矩阵(尽管后面我们会看到一种更简单的方法来作这个):1: let m = Matrix.zero 4 4 2: val m : matrix = matrix [ ... ] 3: 4: m.[0, 0 阅读全文
posted @ 2012-03-21 16:23 tryfsharp 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 在本系列的上篇文章中,我们了解了complex和BigRational类型,它们都是位于F# PowerPack中的数字类型。除了这两种,PowerPack库也包含了一种名为matrix的类型,此类型表示一种由浮点数组成的二维矩阵。在这篇文章中,你将学会在F#中如何使用矩阵,如何使用F#PowerPack中提供的相关函数。我将用一个例子来介绍此语言库,此例子使用所谓的邻接矩阵来展示图。如果你对这些概念不熟悉,请不要担心。这个其实很简单,当看过这个例子后,你将会对它很清楚。此矩阵代表通过一条边连接两个顶点的图。很多矩阵类型中的标准操作在邻接矩阵中都是可用的,因此这篇指南将覆盖下面一些方面:创建l 阅读全文
posted @ 2012-03-21 16:19 tryfsharp 阅读(469) 评论(0) 推荐(0) 编辑
摘要: Record在F#中是一种很重要的用来存贮数据的结构.它与元组和F# 中的枚举(DiscriminatedUnions)差不多,但是又有比他们更方便的地方,如:我们可以很轻松的访问Record中的每个元素的值,而不需要如元组那样做更多的操作才可取得。下面我们看看Record的定义及与之相关的操作Record的定义我们使用type 关键字来定义Record,如我们定义一个名为myRecord的Record: type myRecord = { Name : string ; Age : int }在定义这个Record 之后,可以将myRecord当作一个模板,然后照此模板实例化自己的Reco. 阅读全文
posted @ 2012-03-14 13:55 tryfsharp 阅读(1352) 评论(2) 推荐(1) 编辑