新聞中心
【獨家特稿】在上一篇教程《F#與函數(shù)式編程概述》中我們了解到F#和函數(shù)式編程的一些特點,更多關于F#語言和函數(shù)式編程的介紹可以參考之前對微軟MVP趙頡老師的專訪《TechED 09視頻專訪:F#與函數(shù)式編程語言》。本節(jié)教程我們將學習到F#的一些基礎原理,在開始之前,讓我們先溫習一下我們的Hello World代碼:

成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都做網(wǎng)站、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的樂山網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
- #light
- System.Console.WriteLine(“This is one hello”)
- printfn “This is another hello”
F#是函數(shù)式和面向對象的混合體。它有時候會看起來與C#或Visual Basic驚人的相似,但卻又完全陌生。F#程序以一系列的表達式形式組成,每個表達式可以通過“l(fā)et”標識符被指定,比如:
- let fles = System.IO.DirectoryInfo(@”C:\Users\Chance”).
- GetFiles()
在上面的代碼中,“fles”被指定了一個值,在這個例子中,是一個文件路徑。有意思的是,程序運行中,直到語句在得到右側的返回值前,“fles”的實際類型都沒有被詳細定義。你可能覺得有些別扭,在Java或其他編程語言中,變量fles應該被定義成一種數(shù)據(jù)類型,string或是其他什么類型以在內(nèi)存中可以明確的被編譯器區(qū)別對待,但這些規(guī)則在F#中有些不同。這也導致我們的F#簡明教程稍有不同,我們不會像通常的教程那樣介紹F#的基本數(shù)據(jù)類型,從某種意義上說,F(xiàn)#可以是任意類型或只有一個類型。
F#小提示:F#是一種類型推斷語言,它們在編譯過程中被推斷和確定。如果你在Visual Studio中編寫F#,將鼠標指向某個值就會得到它的類型,編譯器可以通過函數(shù)體或其他方式的定義推斷出類型;Visual Studio是開發(fā)F#的主要工具,推薦您閱讀Visual Studio 2010中關于F#的資源一文。
類型推斷(Type Inference)
我們說數(shù)據(jù)的類型是被推斷出的,因為F#的編譯期進程會試圖根據(jù)變量自身的特點來判斷出它的類型并確保這種類型是安全的。盡管F#是強類型語言,但變量的類型聲明在類型的判斷推理過程中并不是必須的。
類型推斷有自身的優(yōu)點。在使用F#開發(fā)一些大型應用時,比如.NET和Java開發(fā)者都很熟悉的泛型特性(Generics)便是由類型推斷來完成。注意,F(xiàn)#編譯器會視任何沒有類型標注的表達式為泛型。例如,下面的函數(shù)中,各變量的類型被定義(推斷為)泛型,即使程序編寫者沒有定義任何類型。
- let f x =
- let y = g x
- h y
- let f (x:’a) : ’b =
- let y:’c = (g:’a->’c) x
- (h:’c->’b) y
F#小提示:在F#中,泛型類型參數(shù)是一個以撇號為前綴的字符。比如上面例子中的’b和’c就是最常用的泛型參數(shù)。像在.NET中一樣,泛型類型也可使用尖括號語法,比如“Dictionary<’Key,’Value>”。只有一個泛型參數(shù)的時候,你有時候會看到它使用‘前綴’語法而不是尖括號——最常見的是和F#泛型類‘list’和‘option’一起使用。比如“int list”和“l(fā)ist
F#類型推斷機制
F#語言中的大多數(shù)類型推斷可以遵循以下兩條規(guī)則。首先,如果一個函數(shù)用于產(chǎn)生一個值,編譯器將假定該值的類型是函數(shù)需求的。第二,如果一個值是一個表達式的必然結果,這個值的類型是這個表達式所決定的。
有些情況下這些簡單的規(guī)則不夠完全,編譯器必須需要類型聲明。比如,當一個算數(shù)運算符被使用,F(xiàn)#會處理的非常謹慎,如果沒有程序員的明確代碼,不會將一個數(shù)值型賦予另一個。這樣做是為了確保F#在進行大規(guī)模數(shù)值計算時,類型推斷不會加重編譯器的負擔。
針對第二條規(guī)則的例子在方法過載的情況下發(fā)生。比如Write方法在System.Console(.NET中System.Console封裝了基于控制臺應用程序的輸入、輸出和錯誤流操作)中有18個負載。類型推斷可以確定傳送給它的類型,但是無法確定另一個方向傳送的值的類型。
類型推斷不只是簡單的符號,它還可以用于程序功能的檢測。當你寫了一段代碼,類型推斷功能為這些代碼智能的獲得了指定的類型,這意味著錯誤不會被引入程序。這種機制使F#獲得動態(tài)語言的代碼簡潔性的同時保證了完全靜態(tài)的類型系統(tǒng)。
更多關于F#的類型和語法基礎請參考:
◆ F#數(shù)據(jù)類型:Discriminator Union
◆ F#基本語法,模式匹配及List
F#的類型系統(tǒng)和類型推斷機制是學習和理解F#語言的基礎,掌握了這些有利于我們之后的學習。下周我們將繼續(xù)F#的學習,一起探究F#的基礎語法。
當前名稱:F#簡明教程二:F#類型系統(tǒng)和類型推斷機制
網(wǎng)站URL:http://www.dlmjj.cn/article/coogshh.html


咨詢
建站咨詢
