我的博客

Another Joycode.MVC Powered Blog
随笔 - 7, 评论 - 0, 引用 - 0

导航

每月存档

广告

 

原文出处: http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1077.entry

Translated by Mike

学习F#的时候,有三种主要的关于’类型’知识你需要知道. 第一:你需要知道常用的一些.net类型的名称/别名(比如,”int”意思是System.Int32).第二:你需要知道F#特有类型的名字(比如”unit”),这些类型是什么/做什么/什么意思。最后,你需要知道写这些类的语法(比如:泛型使用一对尖括号,函数使用“->”)。这篇博文将会覆盖上面这些有用的F#知识点。

其实这些知识点我在其他博文中 已经涵盖了(至少提到过);这篇文章主要是强调有关‘类型’的知识,并且提供了很多详细内容的链接。

常用.net类型的F#名称

下面是一个常见.net类型和他们在F#中别名的对照表

System.Object

obj

System.Boolean

bool

System.Int32

int

System.String

string

System.Double

float

System.Char

char

<arrays>

array<'a> or 'a array or 'a[]

System.Collections.Generic.IEnumerable<T>

seq<'a>

System.Exception

exn

表中列出的只是最常见的,其实还有更多类型,要想知道基础类型缩写的完整列表,请参考F#设计文档

F#特有类型

F#有许多特有的类型;其中最常用的几个是:unit,list,ref,tuples,Async,Map和Set。我会依次做一个简单说明。

unit类型只有一个值,写做”()”。它有点儿像“void”,从某种意义上说,如果你只想使用一个函数的副作用,这个函数就需要返回一个“unit”类型。每一函数都接受一个参数并且返回一个结果,所以 你用“unit”来指明函数的参数/返回值你并不感兴趣/没意义。(请看这里

list<’T>类型是F#中非常常用的一个类型。它代表一个不可变得单链表。列表常值被写在一对方括号中(如“[1;2;3]”)。“::”操作符可以合并一个元素到列表的最前端,或者把一个列表分解成第一个元素和剩余的元素(如:“head::rest”)。在列表模块中提供了很多供 列表使用的函数。

option<’T>类型用来表示一个可选值,“Some(x)”或者“None”。更多详情请看这里这里

ref<’T>类型有时候用来创建一个可见值。更多详情请看这里这里.

Tuples 用逗号来分隔(并且通常用小括号括起来),如:“(1,2,3)”,元组的类型名称就是由各个组件类型的名称之间加上’*’组成。举个例子,“(true,42)”的类型就是“bool*int”.更多详情请看这里

Async<’T>类型用来表示异步表达式。像学习更多关于Async的知识,这篇博文是一个不错的切入点。你也可以观看PDC视频(从52:20开始的八分钟时间里展示了Async;整个视频是一个很不错的关于F#的介绍)。

Map<’Key,’Value>和Set<’T>类型仅仅是常见.net“Dictionary<Key,Value>”和“HashSet<T>”类型的一个粗略的不可变版本。

另外一个值得一提的类型就是函数类型(functions)。F#函数类型(如”int->int”)没有‘名字’(不像在C#中那样你需要使用一个像“Func<int,int>”这样的有名称的代理类型)。在后台,F#用FastFunc类来表示函数类型。所以当你看到“FastFunc”(比如:在.net 反射器中浏览F#代码的时候),这个就是它。

F#表达类型的语法

(由于F#是一种类型推断语言,所以你写类型名称的机会相比其他语言会非常少。很多时候大部分与类型名称有关的交互来自于提示栏中推断出来的类型名称。)

上面已经提到过,F#用“->”语法表示函数类型;“A->R”是一个接受A并且返回R的函数(请看这里)。

在F#中,泛型类型参数是一个以撇号为前缀的字符。比如’a和’T就是最常用的泛型参数。像在.net中一样,泛型类型也使用尖括号语法,比如“Dictionary<’Key,’Value>”。只有一个泛型参数的时候,你有时候会看到它使用‘前缀’语法而不是尖括号——最常见的是和F#泛型类‘list’和‘option’一起使用。举个例子:“int list”和“list<int>”是同一个东西,只是书写方式不同(这里提到过)。

所以你可以写成“array<int>”或者“int array”,在F#中最常见的数组类型书写方式是:“int[]”。多维数组类型在方括号中使用逗号,比如整数型二维数组就是“int[,]”,三维数组就是“int[,,]”。

类型声明在F#中看起来是这个样子“e:type”,这里‘e’是一个表达式或者模式。类型声明最常用在函数声明中。举个例子:“let f(x:int):int=x+1”——第一个“:int”是说参数‘x’是一个‘int’型,第二个“:int”是说函数的返回值类型是‘int’。函数中的泛型参数通常是隐式的,比如“let id (x:’a):’a = x”,但也可以是显式的,比如“let id<’a> (x:’a):’a = x”。‘_’字符可以用来表示一个不用指明名称的类型;举个例子,如果‘myList’是一个“list<int>”类型,那么表达式“myList :> seq<_>”将会把myList向上转换成一个“seq<int>”类型,因为‘_’被推断为‘int’。

有很多类型系统中的语法很少被用到,所以在这里很简单的介绍一下。语法 #type 差不多就是 “forall ‘a when a :> type”的意思;这个知识点很少被用到/需要。语法^a 和’a很相似,但是允许使用含有有趣的类型约束的运算符重载(“静态的解决类型变量”,按照 C++中模板的方式);这是一个很级别的知识点(仅被算术家使用)。‘delegate’关键字被用来创建.net代理类型;这个特征只在需要和其他.net语言交互时有用。

打印 | 张贴于 2009-10-21 10:40:17 | Tag:暂无标签

留言反馈

暂时没有留言纪录
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode.MVC引擎 0.5.2.0