tuples(元組)簡介:
tuples(元組)作為乙個基本型別在f#中被廣泛的被應用,顧名思義,乙個tuples是兩個或多個值的集合,基本形式如下:
let t2 = (3, "foo") // t2 : int * string
let t3 = (4, "bar", true) // t3 : int * string * bool
其中,小括號是可選的,如下形式也合法,但不推薦
let t2 = 3, "foo"
不存在0元組和1元組
let u = () // u : unit
這裡的u並不是tuples型別,而是unit型別。(即不存在長度為0的tuples)unit型別和c#裡的void型別類似不需要返回值的函式(因為呼叫它們只是為了得到它們的***)
let x = (3) // x : int
這裡的x也不是tuples,而是原始的int型,和大多數語言一樣,括號的乙個主要目的僅僅是為了在你寫表示式的時候需要特殊的執行順序時過載普通操作符的順序,像在"3*(2+1)"中。所以"(3)"僅僅是"3"的"括號版本"這裡的括號只是表示強調。
對tuples的訪問
在c#中,編譯器自動對元組的各元素生成了item1、item2這樣的訪問屬性,在f#中,我們可以通過系統內建的fst和snd這兩個函式實現對tuples的第乙個和第二個元素進行訪問。
let c = fst (1, 2)
let d = snd (1, 2)
這裡可能就有人要問了,如果要訪問第三個的元素該怎麼辦呢?其實可以很簡單的通過模式匹配實現這個功能。
let third (_, _, c) = c
函式型別:
在對tuples有了乙個基本的認識後,我們再來關注一下函式型別,首先看一下這個函式
// g : int * string -> unit
let g(x,s) =
printfn "%d %s" x s
g(3, "foo") // prints 3 "foo"
從g的型別可以看到,函式g接收乙個型別int * string的元組,返回值為unit型別,其功能也一目了然,就是把這兩個元素在螢幕上列印出來。
接下來我們再看一下這個函式
// f : int -> string -> unit
let f x s =
printfn "%d %s" x s
f 3 "foo"
// prints 3 "foo"
從功能上來看,函式f和函式g實現的功能是一樣的,但f引數是柯里化的,其形式為
int -> string -> unit
。要解釋這個形式的引數,首先得把
f x看成是乙個函式,看做如下形式:
letf x s = …
這樣,f x 就是乙個接收乙個int型的值,返回乙個接收string型的引數並返回unit函式的函式。int -> string -> unit
如下這個例子更能說明這一點:
// fp : string -> unit
let fp = f 4
fp "bar"
// prints 4 "bar"
部分應用也可以用在接受元組引數的函式上,不過這樣做需要乙個顯示的lambda。
// gp : string -> unit
let gp = fun s -> g(4, s)
gp "bar"
// prints 4 "bar"
以如下方式解釋f#的函式可以更容易理解
f#函式型別被寫做"a->r"
所有的f#函式接受乙個引數。但是:
引數型別可以是乙個元組,意思是你可以有這樣的呼叫"g(x,s)",並且
返回值型別可以是另外乙個函式,意思是你可以有這樣的呼叫"f x s"。
函式返回型別和形參
1 int add return c 2 int add return c 3 區域性變數不允許以引用 或者指標 形式返回,函式結束,區域性變數生存期就到了 int add int a,int b void main 什麼情況下可以以引用返回?1 返回值定義在全域性 int c 0 int add ...
6 6 1 F 中函式呼叫的型別推斷
6.6.1 f 中函式呼叫的型別推斷 雖然,在 f 中可以用尖括號指定型別引數值,與 c 中的方式相同,但這種方法很少使用。原因是,當編譯器無法推斷出所有的資訊,需要程式設計師的幫助時,我們僅在真正需要的地方,新增型別批註。我們用乙個示例來演示 option.map fun dt dt.year s...
關於單參建構函式和型別轉換函式
其實單參建構函式就是只有乙個引數的建構函式,拷貝建構函式就是他的一種,單參建構函式和型別轉化函式用法正好相反,單參建構函式是把形參中的值或者是物件轉化為本物件,而型別轉化函式是把本物件轉換為乙個值或者乙個其他物件 如下 itoa是乙個可以把int型資料轉化為string型資料的函式。在 includ...