摘要: 各位大虾,原文的pdf文档在这里下载。第一章 简介什么是函数式编程为什么函数式编程很重要什么是F#谁在使用F#谁需要这本书下一步是什么第二章 如何获取、安装和使用F#获取F#在windows上安装F#在Linux上安装F#使用F#的不同方式安装这本书使用的软件总结第三章 函数式编程标识符关键字直接量定值与函数范围递归匿名函数操作符列表列表概括控制流类型与类型推导模式匹配定义类型异常与异常处理惰性求值第四章 命令式编程基元类型mutable关键字定义mutable记录类型ref类型数组数组概括控制流在概括上的遍历调用.NET库的静态方法和属性使用.NET库的对象与方法使用.NET库的索引... 阅读全文
posted @ 2011-11-21 12:00 银河系漫游指南 阅读(1279) 评论(0) 推荐(0) 编辑
摘要: ref类型是在一个程序里使用可变状态的一种简单的方式,也就是说,可以随时间改变的值。ref类型仅仅是一个纪录类型的单一可变字段,在F#库中。访问和更新字段的一些操作符的定义都很简单。F#的ref类型定义使用类型参数,在上一章介绍过这个概念,所以尽管ref类型的值可以是任何类型,一旦您已创建了一个实例的值,你将不能改变值的类型。 创建一个ref类型的实例很简单,你可以使用关键字ref后跟代表任何项目的ref值。下面的例子是编译器的输出(显示phrase的类型是 string ref,意思是一个仅包含字符串的引用类型)let phrase = ref "Inconsistency&quo 阅读全文
posted @ 2011-12-08 21:16 银河系漫游指南 阅读(1112) 评论(0) 推荐(0) 编辑
摘要: 在第三章,你第一次接触了记录类型,我并没有讨论如何更新它们的字段。这是因为,默认情况下记录类型是不可更改的。F#提供了特殊的语法,以允许更新记录类型里的字段,在记录类型的字段前面使用关键字mutable。我必须强调,这一操作改变的内容是记录的字段,而非记录本身。#light type Couple = { her : string ; mutable him : string }let theCouple = { her = "Elizabeth Taylor " ; him = "Nicky Hilton" }let print o = printf 阅读全文
posted @ 2011-12-08 13:03 银河系漫游指南 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 在第三章中,我们谈到如何使用关键字let绑定标识符到值,并指出在那些情况下可以重新定义和恢复之前的值,但是不能修改。如果你想定义一个标识符,其值可以随时间而改变(亦即随程序运行而改变),你可以使用mutable关键字,用于更新这些标识符的是一个特殊的操作符,左ASCII箭头(或只是左箭头),由一个小于号和破折号(-)组成。使用左箭头的更新操作具有unit类型,所以你可以链接多个操作。下一个例子演示如何定义一个字符串类型的mutable标识符,然后改变它的值。#light let mutable phrase = "How can I be sure, " print_end 阅读全文
posted @ 2011-12-08 11:49 银河系漫游指南 阅读(588) 评论(0) 推荐(0) 编辑
摘要: 前言: 正如你在第三章看到的,你可以使用F#作为纯函数编程。然而有些问题,最明显的是I/O,没有状态的改变几乎是不可能的。F#不要求你的程序是一个无状态的模式。它允许你使用可变(mutable)标识符,其值可以随时间而改变。F#还支持命令式编程的其他结构。在第三章你已经看到一些例子。任何输出到控制台的例子都包含一些命令式代码在函数式代码旁。在本章中,我们将探索这些结构,和更多其他结构,及其更多细节。 首先,先了解F#的unit类型,这种特殊的类型意味着“no value”,是命令式编程特有的。接下来,你将看到F#里处理可变状态的一些方法,也就是说,可以随时间改变值的类型。这些都是ref类型,可 阅读全文
posted @ 2011-12-07 22:29 银河系漫游指南 阅读(760) 评论(0) 推荐(0) 编辑
摘要: 惰性求值常用于函数式编程。该理论表述为,如果语言无副作用,则编译或运行时可以自由选择表达式的求值顺序。如你所知,F#中允许函数产生副作用,所以它不能在编译或运行时有一个自做主张的函数求值。因此,F#可以说有严格的求值顺序,或者说是严格的语言。你仍然可以利用惰性求值的优势,但必须明确哪些计算可以延迟,也就是,惰性方式的计算。使用关键字lazy来延迟计算,也就是,调用惰性计算时。lazy内的表达式保持不计算,直到评估。它被强制生效函数在惰性模块里。当强制函数是应用于一个特定惰性表达式,值的计算;那么结果被缓存,其后调用强制函数将返回缓存的值,不管它是什么,即便这意味着引发异常。下面显式一个简单的. 阅读全文
posted @ 2011-12-07 16:05 银河系漫游指南 阅读(728) 评论(0) 推荐(0) 编辑
摘要: 在F#里异常的定义类似于联合类型构造函数的定义,异常处理的语法类似于模式匹配。定义异常,你可以使用exception 关键字,然后是异常名称,和可选的关键字of 和异常包含值的所有类型,多种类型用星号分隔。下一个例子演示了一个异常的定义,WrongSecond,其中包含一个整数值。exception WrongSecond of int 你可以使用关键字raise抛出一个异常,如下testSecond函数的else子句。F#中还有一个引发异常关键字,failwith 函数,如以下的if子句。通常情况下,如果你只想抛出一个说明什么地方出了错的文字(异常),你可以使用failwith 抛出一个通. 阅读全文
posted @ 2011-12-07 12:33 银河系漫游指南 阅读(484) 评论(0) 推荐(0) 编辑
摘要: F#的类型系统提供一个可以定义定制类型的特性。所有的F#的类型分为两个类别。第一类是元组或纪录类型。这些类型的可以组合成组合类型(类似于C的结构或C#的类)。第二类是聚合(sum)类型,有时也称为联合(union)类型。 元组是一种快速且方便组合一组值的方式。值由逗号隔开,并可以用一个标识符表示。如下面例子中的第一行。你也可以反向取出组合里的值,如下面的第二和第三行,由逗号分割的标识符在等号的左侧,每个标识符依次从元组中取出一个单一值。如果你想忽略元组中的一个值,你可以使用占位符 _ 告诉编译器你不需要使用该值,如第二和第三行所示。#light let pair = true, false . 阅读全文
posted @ 2011-11-30 12:37 银河系漫游指南 阅读(853) 评论(0) 推荐(0) 编辑
摘要: 模式匹配允许你查看一个标识符,根据其值的不同做出不同的计算。这有点类似if … then … else …表达式,和C++ 或 C#中的switch 语句很相似,但它的功能更强大,更灵活。 F#允许你在一个类型变量或值上进行模式匹配的构造。它有几种不同的形式和做法。在必要位置该语言有异常处理的语法,我们将在本章后面讨论“异常与异常处理”。模式匹配最简单的形式就是匹配值,在“值与函数”里,你已看到用它实现的Fibonacci数列。为说明语法,下一个例子将生成Lucas 序列,数字顺序如下:1, 3, 4, 7, 11, 18, 29, 47, 76, ….。Lucas 序列与Fibonacci. 阅读全文
posted @ 2011-11-25 16:18 银河系漫游指南 阅读(634) 评论(0) 推荐(0) 编辑
摘要: F#是强类型语言,这意味着你不能使用一个不恰当的值调用一个函数,你不可以用字符串调用一个需要整数参数的函数;必须显式地进行转换。这种涉及到值的类型的语言方式就做类型系统。F#的类型系统在一般语言中并不常见,在F#里,所有的值类型,包括函数(functions)的值,通常情况下并不需要明确声明类型,编译器将根据函数的定义类型和函数被调用的返回类型推理出值的类型。如果全部没有问题,编译器将推理出所有的类型,只有当一个类型不匹配时才会报告类型错误。这个过程一般称为类型推理。如果想在程式里得到更多类型推理的信息,你可以使用-i开关使编译器显示更多信息,Visual Studio用户则可以把鼠标悬停在. 阅读全文
posted @ 2011-11-24 17:01 银河系漫游指南 阅读(477) 评论(0) 推荐(0) 编辑
摘要: F#有强大的控制流。这种方式不同于其他的函数式语言,控制流的概念非常稀少,因为本质上表达式可以代替任何命令。你可以在下面的例子中看到控制流 if … then … else … 表达式. 在F#里 if … then … else … 构造成一个表达式,这意味着它返回一个值。返回值取决于布尔表达式的真与假。下一个例子说明了这一点。#light let result = if System.DateTime.Now.Second % 2 = 0 then "heads" else "tails" print_string result if … then 阅读全文
posted @ 2011-11-24 11:35 银河系漫游指南 阅读(540) 评论(0) 推荐(0) 编辑