F#簡明教程三:F#語法精要
原創(chuàng)【51CTO獨家特稿】在上一節(jié)F#教程中,我們對F#的類型系統(tǒng)和類型推斷機制有了一個初步的認識。F#的類型推斷原理是學習F#的重要基礎。本節(jié)課程,我們將在F#類型基礎上進一步學習F#的一些基本語法。
“l(fā)et”表達式是F#語法的核心,可以用作定義函數(shù)、序列等多種用途。另外,F(xiàn)#使用空格來標記程序塊的開始與結束。
定義值
- let x = 2
定義函數(shù)值
- let f a = a + x
定義循環(huán)函數(shù)
- open System.IO
- let rec printSubDirFiles dir =
- let fles = Directory.GetFiles dir
- let dirs = Directory.GetDirectories dir
- printf “%s\n%A\n\n” dir fles
- Array.iter printSubDirFiles dirs
此外,F(xiàn)#還提供傳統(tǒng)的循環(huán)和迭代等流程控制結構,比如if、for、while。但我們需要注意的是,F(xiàn)#中的“if…then”和“if…then…else”與傳統(tǒng)的面向?qū)ο笳Z言有些不同。在F#中,大多數(shù)表達式必須含有一個值,并且控制結構“if…then…else”表達式的兩邊的值必須是同一類型。注:F#的這種語法約定源自其推斷型語言的編譯機制,詳細請參考上一節(jié)教程中關于F#類型推斷機制的介紹。
F#中的常用流程控制語句示例
與大多數(shù).NET平臺上的編程語言相似,F(xiàn)#也提供一些組織代碼的機制。事實上,F(xiàn)#提供模塊和命名空間兩種方式,下面的一些演示將給出C#和VB的命名空間。F#的模塊化不只局限與語法范圍,還提供模塊化的層級標準,例如集合和函數(shù)。
F#的基礎代碼組織:命名空間、類型和模型
- namespace MyFSharpProg
- open System.Net
- type Foo () =
- member x.GetRequest = WebRequest.
- Create
- module Main = begin
- // values and functions here
- end
與傳統(tǒng)的函數(shù)式編程原則相同,多數(shù)時候,F(xiàn)#的標識符是不可變的。但F#允許定義和修改使用“mutable”保留字的值,或通過“ref”保留字改變其前面的引用。mutable的值可以通過左箭頭操作(“<-”);ref的值可以通過“:=”操作符制指定。我們可以通過“!”獲取ref的值。下面來看具體示例:
聲明/更新可變值
- let mutable x = 0
- x <- x + 1
聲明/更新參考值
- let x = ref 0
- x := !x + 1
F#小提示:在習慣了C#或Java等編程語言后,剛剛開始F#編程,閱讀F#代碼感覺就像亂碼一樣。因為F#為了保有函數(shù)式編程的一些優(yōu)秀特質(zhì),不得不引入一些如“<-”、“:=”、“!”等奇怪的符號作為操作符或運算符;另外,F(xiàn)#在代碼中需要通過一些推斷機制來評判變量的類型,在閱讀F#代碼時,應對F#的類型系統(tǒng)做到心中有數(shù),所以,多數(shù)時候我們看到的是“l(fā)et”,而不是傳統(tǒng)的“int”、“string”、“float”等。希望大家能充分理解F#的類型系統(tǒng)和類型推斷機制,這是F#的重要基礎,也是走進函數(shù)式編程語言的重要一步。
【F#教程回顧】