11 2011 档案
摘要:F#的类型系统提供一个可以定义定制类型的特性。所有的F#的类型分为两个类别。第一类是元组或纪录类型。这些类型的可以组合成组合类型(类似于C的结构或C#的类)。第二类是聚合(sum)类型,有时也称为联合(union)类型。 元组是一种快速且方便组合一组值的方式。值由逗号隔开,并可以用一个标识符表示。如下面例子中的第一行。你也可以反向取出组合里的值,如下面的第二和第三行,由逗号分割的标识符在等号的左侧,每个标识符依次从元组中取出一个单一值。如果你想忽略元组中的一个值,你可以使用占位符 _ 告诉编译器你不需要使用该值,如第二和第三行所示。#light let pair = true, false .
阅读全文
摘要:模式匹配允许你查看一个标识符,根据其值的不同做出不同的计算。这有点类似if … then … else …表达式,和C++ 或 C#中的switch 语句很相似,但它的功能更强大,更灵活。 F#允许你在一个类型变量或值上进行模式匹配的构造。它有几种不同的形式和做法。在必要位置该语言有异常处理的语法,我们将在本章后面讨论“异常与异常处理”。模式匹配最简单的形式就是匹配值,在“值与函数”里,你已看到用它实现的Fibonacci数列。为说明语法,下一个例子将生成Lucas 序列,数字顺序如下:1, 3, 4, 7, 11, 18, 29, 47, 76, ….。Lucas 序列与Fibonacci.
阅读全文
摘要:F#是强类型语言,这意味着你不能使用一个不恰当的值调用一个函数,你不可以用字符串调用一个需要整数参数的函数;必须显式地进行转换。这种涉及到值的类型的语言方式就做类型系统。F#的类型系统在一般语言中并不常见,在F#里,所有的值类型,包括函数(functions)的值,通常情况下并不需要明确声明类型,编译器将根据函数的定义类型和函数被调用的返回类型推理出值的类型。如果全部没有问题,编译器将推理出所有的类型,只有当一个类型不匹配时才会报告类型错误。这个过程一般称为类型推理。如果想在程式里得到更多类型推理的信息,你可以使用-i开关使编译器显示更多信息,Visual Studio用户则可以把鼠标悬停在.
阅读全文
摘要: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
阅读全文
摘要:列表概括使创建和转化集合更加容易。你可以创建F#列表、序列、和数组而直接使用概括语法(关于数组,序列类型将在下一章介绍,这些都是.NET BCL’s 集合类型)。最简单的概括是指定范围的项目集合,通过(..)开始一个起源,到一个结束。下面给出一个示例:#light let numericList = [ 0 .. 9 ] let alpherSeq = { 'A' .. 'Z' } printfn "%A" numericList printfn "%A" alpherSeq 执行结果: [0; 1; 2; 3; 4; 5
阅读全文
摘要:F#中的列表是F#内置的简单集合类型。一个F#列表可以为空,用方括号代表([]),也可以是一组值的串联。你可以使用F#内置的操作符(::)串联一个列表。下面的例子给出一些示例,开始第一行为空列表,第二三行为使用(::)串联多个字符串的列表。#light let emptyList = [] let oneItem = "one " :: [] let twoItem = "one " :: "two " :: [] 将值串联的语法有点冗长,因此,如果你只是想定义一个列表,可以使用如下简写。这种速记法将列表项放在方括号之间,并用分号(;
阅读全文
摘要:在F#中,你可以使用运算符更加美观的调用函数。F#提供了两种不同的运算符,前缀和中缀。一个前缀运算符应用于一个操作数,而中缀运算符应用于两个或更多。前缀运算符出现在操作数之前,而中缀运算符出现在两个操作数之间。运算符加上()可以变成函数来使用,也可以认为他们是函数的一种简写方式。 F#提供了丰富的运算符。可以应用于数字、逻辑、字符串和集合类型。F#和它的库中定义的运算符基本都包含在本书中,你会看到更多的使用方法与样例。 与C#一样,F#中的运算符可以重载,这意味一个运算符可以应用于多个类型。与C#不同的是,两个操作数必须是同一类型,否则编译器将产生错误(不要质疑F#的约束,这是创建稳健系统更.
阅读全文
摘要:F#提供另一种定义函数的方式,使用关键字fun。通常情况下,使用这个符号不需要给函数一个名称,因此,有时也称其为匿名函数,或称为lambda函数,也可称其为lambda表达式。一个函数不需要名字的想法可能有点奇怪,但如果一个函数仅做为一个参数传递给另一个函数,那么它就不需要自己的名字。下面是一个示例。#light let x = (fun x y -> x + y) 1 2 你可以创建一个使用关键字function的匿名函数。创建这种函数的方法不同于使用关键字fun,因为你可以在使用关键字function时使用模式匹配,而无需match test-expression with关键字。它
阅读全文
摘要:递归是指定义在自身上的函数,换句话说,函数的定义里调用自己。在函数式编程里,通常使用递归表示命令式编程里的循环,许多人认为递归比循环更容易理解算法。 要在F#里使用递归,在函数定义的let关键字后加rec关键字就可以在函数中使用函数名。下面给出一个示例 #light let rec fib x = match x with | 1 -> 1 | 2 -> 1 | x -> fib (x - 1) + fib (x - 2) printfn "(fib 2) = %i" (fib 2) printfn "(fib 6) = %i" (fi
阅读全文
摘要:在一个程序里,你可以在有效的范围里使用一个标识符。范围是一个相当简单的概念,重要的是要有很好的理解。如果尝试在标识符范围外使用它,你会得到一个编译错误。所有的标识符,不论是值(Values)或函数(Functions),其范围从其定义,直到其出现部分(空格缩进部分)的结束。在顶层的标识符(即标识符的定义没有被函数或值包含),其范围从它的定义直到源代码的结束有效。一旦一个顶层标识符被分配一个值(value)(或功能(function)),这个值就不能更改或重新定义。 在函数中定义的标识符与顶层标识符稍有不同,它们可以使用let关键字重新定义。这意味着,在F#里不必保留标识符用于保留中间值。...
阅读全文
摘要:在F#里,值(Values)和函数(Functions)很难区分,因为函数也是值,在F#语法里他们是同一个概念。例如,在下面的代码里,第一行,把10分配给标识符n; 在第二行中,一个函数:add,并定义两个参数与运算。注意语法是多么的相似,唯一的区别是,函数名后有参数。第一行10是一个值,表达式a+b结果也是一个值。所以函数也代表一个值。另一个角度,不论是使用值还是函数,我们都只取它们的结果(值的结果即为值本身),所以本质上他们是相同的,对于使用他们的方法来说,结果的类型才是最重要的。#lightlet n = 10let add a b = a + blet addFour = add 4.
阅读全文
摘要:直接量代表的常数值,类似于命令式编程中的定值。F#中有一套丰富的直接量。表3-1总结了一些。 Table 3-1.F# 直接量 例子F# 类型.NET 类型 描述"Hello\t ", "World\n"stringSystem.String一个字符串(\) 是转义字符@"c:\dir\fs", @""""stringSystem.String禁止转义(\) 的方法"bytesbytesbytes"Bbyte arraySystem.Byte[]存储在字节数组中的字符串
阅读全文
摘要:大多数程序语言都有自己的关键字。关键字是语言的令牌,由编译器的功能而定。在F#中,不能使用关键字作为标识符的名称或类型的名称。以下是F#的关键字:abstract lsland lsras lxorassert match memberasr modbegin moduleclass mutable namespacedefault newdelegate nulldo ofdone opendowncast ordownto overrideelse ...
阅读全文
摘要:标识符是指在F#里值的名称,可以在程序的后面引用的标识符定义的值。定义一个标识符,使用关键字let指定名称,等号符号,和一个表达式。表达式是任何一块代码,返回一个值的计算。 示例:let pi = 3.14 从命令式编程背景的大多数人来看,这会是一个变量赋值。有很多相似之处,但也有关键的不同。在纯函数编程中,一旦标识符被赋值,它的值就永远不变。 标识符可以指一个值或者函数,因为函数也代表值。这意味着F#没有真正概念的函数名和参数名,他们都是标识符。你可以写一个函数的定义,在let后两个或两个以上的标识符,等号符号,和一个表达式,如:let raisePowerTwo x = x ** ...
阅读全文
摘要:函数式编程(FP)是最古老的三大编程范式之一。 其他的函数式语言包括:1955年发明的IPL,1958年发明的Lisp,以及后期的SML, OCaml,Haskell, and Clean, among others等。F#语法与OCaml和Haskell最接近。 F#的巨大优势之一是,您可以使用多个范式并组合成最便捷的方式来解决问题。
阅读全文
摘要:各位大虾,原文的pdf文档在这里下载。第一章 简介什么是函数式编程为什么函数式编程很重要什么是F#谁在使用F#谁需要这本书下一步是什么第二章 如何获取、安装和使用F#获取F#在windows上安装F#在Linux上安装F#使用F#的不同方式安装这本书使用的软件总结第三章 函数式编程标识符关键字直接量定值与函数范围递归匿名函数操作符列表列表概括控制流类型与类型推导模式匹配定义类型异常与异常处理惰性求值第四章 命令式编程基元类型mutable关键字定义mutable记录类型ref类型数组数组概括控制流在概括上的遍历调用.NET库的静态方法和属性使用.NET库的对象与方法使用.NET库的索引...
阅读全文

浙公网安备 33010602011771号