Chapter3 - Types And Type Interface

F# 是一门强类型的语言,这意味着你不可以使用一个不适合的参数来调用一个函数。

你必须在必要的时候进行适当的类型转换,或必须使用匹配的类型。

 

一般来说,你不需要特别的区声明一个类型,因为编译器会自动帮你推断类型。

比如自动帮你推出一个函数的参数或者他的返回值会是什么类型。

除非编译器无法推断出这个代码块需要的类型,或是当前的代码块可能会有多种匹配方式,

才会需要你去声明这个类型。

 

下面的例子中定义了 两个F# 的标识符并展示出他们的类型。

 


let aString = "Spring time in Paris"

let anInt = 42


-----------

val aString : string

val anInt : int

-----------

 

而下面这个定义的会稍微有趣一些。

 


let makeMessage x = (string_of_int x) + "days to spring time"

left half x = x / 2


 

----------------

val makeMessage : int -> string

val half : int -> int

----------------

上面的信息显示出了编译器已经帮我们推断出,对第一个函数 makeMessage 需要的参数是 int 类型的,

而他将返回一个 string 的值。

而对于half 来说, 他接收一个 int 类型的值,并返回一个 int类型。

 

下面再看几个定义


 
let div1 x y = x / y

let div2 (x ,y) = x / y

let divRemainder x y = x / y, x % y


 

-----------------

val div1 : int -> int -> int

val div2 : int * int -> int

val divRemainder : int -> int -> int * int

-----------------

上面的信息显示了 div1 可以接收 两个 int 的参数并返回 int

div2 则接收一个 int 类型的 元组(tuple) 并返回一个 int

divRemainder 则接收两个 int 的参数并返回一个 int类型的 元组(tuple)

首先我们来看,div1,因为他接收的是两个 int 类型的参数,并且从 int -> int -> int

我们可以看出,它是可以进行柯里化的,因为当我们传递了第一个参数后,它就会演化成 int -> int

而对于 div2, 因为它接收的是一个元组(tuple),所以我们必须一次传递全部参数,才能调用它。

divRemainder也亦然

 

再来看看下面一个

 

let doNothing x = x


------------------

val doNothing : `a -> `a

------------------

 

这意味着它接收的参数跟返回值都是泛型,也就是说,当你传递 int 的时候他返回的就是 int,

string 就是 string。

对于泛型的相关知识,可以查阅一些其他资料。

 

 

下面我们来看其他的几个声明

 


let doNothingToAnInt (x : int) = x

let intList = [1;2;3]

let (stringList : list<string>) = ["one";"two":"three"]


 

-------------------

val doNothingToAnInt _int : int -> int

val intList : int list

val stringList : string list

-------------------

 

首先,第一个doNothingToAnInt 我们主动声明了接收的参数类型必须为 int,声明的方法就是

参数名 : 类型,而对于返回值,则是编译器根据我们的参数类型推断出来的

对于后面两个,编译器也能够自动的根据列表的类型来推断出他的类型分别为 int list跟string list

这里的 string list 分别对应.Net 类库的 list<string> 字符串的列表,int list也一样。

posted on 2010-09-19 09:17  兴说:  阅读(239)  评论(0编辑  收藏  举报