摘要: 前言: 正如你在第三章看到的,你可以使用F#作为纯函数编程。然而有些问题,最明显的是I/O,没有状态的改变几乎是不可能的。F#不要求你的程序是一个无状态的模式。它允许你使用可变(mutable)标识符,其值可以随时间而改变。F#还支持命令式编程的其他结构。在第三章你已经看到一些例子。任何输出到控制台的例子都包含一些命令式代码在函数式代码旁。在本章中,我们将探索这些结构,和更多其他结构,及其更多细节。 首先,先了解F#的unit类型,这种特殊的类型意味着“no value”,是命令式编程特有的。接下来,你将看到F#里处理可变状态的一些方法,也就是说,可以随时间改变值的类型。这些都是ref类型,可 阅读全文
posted @ 2011-12-07 22:29 银河系漫游指南 阅读(761) 评论(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 银河系漫游指南 阅读(485) 评论(0) 推荐(0) 编辑