Chapter3 - Types And Type Interface
时间:2010-09-19 来源:兴说:
你必须在必要的时候进行适当的类型转换,或必须使用匹配的类型。
一般来说,你不需要特别的区声明一个类型,因为编译器会自动帮你推断类型。
比如自动帮你推出一个函数的参数或者他的返回值会是什么类型。
除非编译器无法推断出这个代码块需要的类型,或是当前的代码块可能会有多种匹配方式,
才会需要你去声明这个类型。
下面的例子中定义了 两个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也一样。