2011年9月18日 星期日

F# Tuples

F#裡最重要的就是Tuple, 這也是很多人對於小圓括弧產生誤解的東西, 在一般的程式語言中(類C/C++), ()<== 這個東西是用來當成function傳入參數, 或是if(), for(), someFun()使用的, 而在裡面的","是用來分隔不同的expression, 並不用來當成數學形式上的數對使用。
但是在F#的世界裡, (a, b, c)就會被當成數對囉。看一下下面的例子:

// Tuple of two integers.
( 1, 2 ) 

// Triple of strings.
( "one", "two", "three" ) 

// Tuple of unknown types.
( a, b ) 

// Tuple that has mixed types.
( "one", "1", "2.0" ) 

// Tuple of integer expressions.
( a + 1, b + 1) 
這些都是一組一組的變數組合, 那這些東西如何運用在F#程式裡呢?
> let tuple = (42, "Hello World");;
val tuple : int * string = (42, "Hello World")

> let (num, str) = tuple;;
val str : string = "Hello World"
val num : int = 42
這樣我們就可以指定一個變數為tuple, 或是再把tuple裡面的值給取出。
這裡還有一件很有趣的事情, 在上一個例子中組合裡的東西, 型別是 int * string, 也就是他的型別是一個以兩個不同類別所構成的, 那如何讓一個function回傳一個組合呢?
> let myFun a b =
-     let x = a + b
-     let y = a - b
-     (x, y);;

val myFun : int -> int -> int * int
如此一來就可以用組合的方式傳回一個回傳值。而且也可以看到function myFun的型別推導過程。
Tuple當 然不只有這樣的功能, 在matching pattern時, 他也可以有所作用, 當然還沒有學過matcing, 等解到matcing時, 我們自然就會看到了。下面是例子, 先不解釋了…
let function1 x =
    match x with
    | (var1, var2) when var1 > var2 -> printfn "%d is greater than %d" var1 var2 
    | (var1, var2) when var1 < var2 -> printfn "%d is less than %d" var1 var2
    | (var1, var2) -> printfn "%d equals %d" var1 var2

function1 (1,2)
function1 (2, 1)
function1 (0, 0)

沒有留言: