FSharp简明教程Word下载.docx
- 文档编号:14840082
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:11
- 大小:26.13KB
FSharp简明教程Word下载.docx
《FSharp简明教程Word下载.docx》由会员分享,可在线阅读,更多相关《FSharp简明教程Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
F#与函数式编程语言》。
F#小背景:
看似年轻的F#已经有近10年的历史。
最初由微软研究院的DonSyme于2002年立项研发;
F#在2005年推出第一个版本,2007年底,微软宣布F#进入产品化阶段。
在不断的改进中,F#从C#、Linq和Haskell中吸收了很多优点。
1.1F#编程起步
F#可以运行在.NETFramework2.0版本以上的平台。
如果你的VisualStudio之前没有安装F#,可以从微软F#DeveloperCenter获得(-us/fsharp/default.aspx)。
不能免俗,让我们来看看F#的HelloWorld代码:
1#light
2isonehello”)
3printfn“Thisisanotherhello”
将代码保存为hello.fs文件后,我们需要在命令行中通过fsc.exe编译生成一个.NET程序集。
在命令行中的编译代码如下:
fschello.fs
通过上面的代码,我们就得到了常见的可执行文件(.exe文件),这就是我们F#的起步——hello.exe。
F#小提示:
F#是.NET平台上的一个编译型语言,但仍然可以像脚本语言一样运行。
可以使用VisualStudio或fsi.exe(在F#安装目录下的bin目录)进行F#脚本的执行。
1.2代码解读
让我们来仔细看看hello.fs文件里的代码
◆程序首先以“#light”开始,在以后的F#之路上,我们会经常看到“#light”;
大多数时候,“#light”总是出现在F#程序的开始位置,这是F#轻量级语法的标识;
在最新的F#版本中,#light将作为默认选项。
◆“
◆“printfn”是F#的一个常用函数,他会将双引号中的参数输出到控制台上显示。
跟其他程序的HelloWorld一样,这段F#代码简单易懂,看着跟其他语言写就的HelloWorld还有些相似;
但作为函数式编程语言,F#的语法和编程中的思路却有很大的不同。
在下周的章节中,我们将深入F#编程,讲解F#的类型系统及编译机制。
2.F#类型系统和类型推断机制
F#是一种类型推断语言,它们的类型在编译过程中被推断和确定;
这与Java或C#中的泛型基本相似,本节教程我们将介绍F#的类型系统和类型推断机制,这是理解F#的基础。
在上一篇教程《F#与函数式编程概述》中我们了解到F#和函数式编程的一些特点,更多关于F#语言和函数式编程的介绍可以参考51CTO之前对微软MVP赵颉老师的专访《TechED09视频专访:
本节教程我们将学习到F#的一些基础原理,在开始之前,让我们先温习一下我们的HelloWorld代码:
F#是函数式和面向对象的混合体。
它有时候会看起来与C#或VisualBasic惊人的相似,但却又完全陌生。
F#程序以一系列的表达式形式组成,每个表达式可以通过“let”标识符被指定,比如:
1letfles=
2GetFiles()
在上面的代码中,“fles”被指定了一个值,在这个例子中,是一个文件路径。
有意思的是,程序运行中,直到语句在得到右侧的返回值前,“fles”的实际类型都没有被详细定义。
你可能觉得有些别扭,在Java或其他编程语言中,变量fles应该被定义成一种数据类型,string或是其他什么类型以在内存中可以明确的被编译器区别对待,但这些规则在F#中有些不同。
这也导致我们的F#简明教程稍有不同,我们不会像通常的教程那样介绍F#的基本数据类型,从某种意义上说,F#可以是任意类型或只有一个类型。
F#是一种类型推断语言,它们在编译过程中被推断和确定。
如果你在VisualStudio中编写F#,将鼠标指向某个值就会得到它的类型,编译器可以通过函数体或其他方式的定义推断出类型;
VisualStudio是开发F#的主要工具,51CTO推荐您阅读VisualStudio2010中关于F#的资源一文。
2.1类型推断(TypeInference)
我们说数据的类型是被推断出的,因为F#的编译期进程会试图根据变量自身的特点来判断出它的类型并确保这种类型是安全的。
尽管F#是强类型语言,但变量的类型声明在类型的判断推理过程中并不是必须的。
类型推断有自身的优点。
在使用F#开发一些大型应用时,比如.NET和Java开发者都很熟悉的泛型特性(Generics)便是由类型推断来完成。
注意,F#编译器会视任何没有类型标注的表达式为泛型。
例如,下面的函数中,各变量的类型被定义(推断为)泛型,即使程序编写者没有定义任何类型。
1letfx=
2lety=gx
3hy
1letf(x:
’a):
’b=
2lety:
’c=(g:
’a->
’c)x
3(h:
’c->
’b)y
在F#中,泛型类型参数是一个以撇号为前缀的字符。
比如上面例子中的’b和’c就是最常用的泛型参数。
像在.NET中一样,泛型类型也可使用尖括号语法,比如“Dictionary<
’Key,’Value>
”。
只有一个泛型参数的时候,你有时候会看到它使用‘前缀’语法而不是尖括号——最常见的是和F#泛型类‘list’和‘option’一起使用。
比如“intlist”和“list<
int>
”表达同一种功能,只是书写方式不同。
2.2F#类型推断机制
F#语言中的大多数类型推断可以遵循以下两条规则。
首先,如果一个函数用于产生一个值,编译器将假定该值的类型是函数需求的。
第二,如果一个值是一个表达式的必然结果,这个值的类型是这个表达式所决定的。
有些情况下这些简单的规则不够完全,编译器必须需要类型声明。
比如,当一个算数运算符被使用,F#会处理的非常谨慎,如果没有程序员的明确代码,不会将一个数值型赋予另一个。
这样做是为了确保F#在进行大规模数值计算时,类型推断不会加重编译器的负担。
针对第二条规则的例子在方法过载的情况下发生。
比如Write方法在System.Console(.NET中System.Console封装了基于控制台应用程序的输入、输出和错误流操作)中有18个负载。
类型推断可以确定传送给它的类型,但是无法确定另一个方向传送的值的类型。
类型推断不只是简单的符号,它还可以用于程序功能的检测。
当你写了一段代码,类型推断功能为这些代码智能的获得了指定的类型,这意味着错误不会被引入程序。
这种机制使F#获得动态语言的代码简洁性的同时保证了完全静态的类型系统。
更多关于F#的类型和语法基础请参考:
◆F#数据类型:
DiscriminatorUnion
◆F#基本语法,模式匹配及List
F#的类型系统和类型推断机制是学习和理解F#语言的基础,掌握了这些有利于我们之后的学习。
下周我们将继续F#的学习,一起探究F#的基础语法。
3.基本语法,模式匹配及List
F#是随着VS2010Beta版一起正式推出的另一个基于.NET平台的语言,以函数式语言著称。
这个F#入门文章介绍了F#的基本语法,模式匹配及List基本类型。
F#随着VSTS2010Beta1发布也有一段时间了,园子里应该也有不少人对它感兴趣吧。
下面的例子是我在学F#基本语法时写的一个简单SieveofEratosthenes实现,通过剖析这一小段代码,我希望大家能对F#有个简单认识,并能自己写一些简单的小程序。
3.1F#入门代码
1letGetAllPrimesBeforen=
2letcontainer=Array.create(n+1)0
3letrecloopacc=function
4|[]->
List.revacc
5|hd:
:
tl->
6ifcontainer.[hd]=1then
7loopacctl
8else
9forjin[hd..hd..n]do
10container.[j]<
-1
11loop(hd:
acc)tl
12loop[][2..n]
13letprimesBefore120=GetAllPrimesBefore120
进入正题
letGetAllPrimesBeforen=
第一行,申明函数GetAllPrimesBefore,并且该函数有一个参数n,在这里我没有指定n的类型,因为编绎器可以通过函数体对n的类型进去推断,比如在本例中,n就是int类型,当然我们也可以显示的指定n的类型,比如letGetAllPrimesBefore(n:
int),这样我们就指定了n为int型(注意:
(n:
int)中的括号不能省略,letGetAllPrimesBeforen:
int的意思是该函数返回的值的int型)。
说完了参数,再说下返回值,同样,编绎器会根据函数体上下文对返回值类型进去推断,所以我们不需要申明返回类型。
letcontainer=Array.create(n+1)0
第二行,首先请注意该行与第一行相对有一个缩进({TAB}),F#和Python一样,也是通过{TAB}缩进来组织代码结构的。
这一行我们定义了一个变量container,它的类型是Array,大小为n+1,并且值全部初使化为0
接下来就是这个函数的主要部分了,首先我们定义了一个递归函数(我们发现定义递归函数需要加rec关键字)。
它接受两个参数,acc和一个List,有朋友可能要问了,这里明明我只看到一个参数acc,你说的那个List在哪呢?
可能有细心的朋友也发现了这里的函数定义不光前面有rec,在等号后面还加了个function,那么function是做什么用的呢?
3.2F#入门:
模式匹配
这里我需要首先讲一下PatternMatching(模式匹配),PatternMatching有些类似于C#中的switch语句(当然它要比C#中的switch强大许多,但这不是本文的目地,所以略去不表),可以根据expr的值去执行某一具体分支,它的基本
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FSharp 简明 教程
![提示](https://static.bdocx.com/images/bang_tan.gif)