自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

F#簡(jiǎn)明教程二:F#類型系統(tǒng)和類型推斷機(jī)制

原創(chuàng)
開(kāi)發(fā) 開(kāi)發(fā)工具
F#是一種類型推斷語(yǔ)言,它們的類型在編譯過(guò)程中被推斷和確定;這與Java或C#中的泛型基本相似,本節(jié)教程我們將介紹F#的類型系統(tǒng)和類型推斷機(jī)制,這是理解F#的基礎(chǔ)。

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

  1. #light  
  2. System.Console.WriteLine(“This is one hello”)  
  3. printfn “This is another hello” 

F#是函數(shù)式和面向?qū)ο蟮幕旌象w。它有時(shí)候會(huì)看起來(lái)與C#或Visual Basic驚人的相似,但卻又完全陌生。F#程序以一系列的表達(dá)式形式組成,每個(gè)表達(dá)式可以通過(guò)“let”標(biāo)識(shí)符被指定,比如:

  1. let fles = System.IO.DirectoryInfo(@”C:\Users\Chance”).  
  2. GetFiles() 

在上面的代碼中,“fles”被指定了一個(gè)值,在這個(gè)例子中,是一個(gè)文件路徑。有意思的是,程序運(yùn)行中,直到語(yǔ)句在得到右側(cè)的返回值前,“fles”的實(shí)際類型都沒(méi)有被詳細(xì)定義。你可能覺(jué)得有些別扭,在Java或其他編程語(yǔ)言中,變量fles應(yīng)該被定義成一種數(shù)據(jù)類型,string或是其他什么類型以在內(nèi)存中可以明確的被編譯器區(qū)別對(duì)待,但這些規(guī)則在F#中有些不同。這也導(dǎo)致我們的F#簡(jiǎn)明教程稍有不同,我們不會(huì)像通常的教程那樣介紹F#的基本數(shù)據(jù)類型,從某種意義上說(shuō),F(xiàn)#可以是任意類型或只有一個(gè)類型。

F#小提示:F#是一種類型推斷語(yǔ)言,它們?cè)诰幾g過(guò)程中被推斷和確定。如果你在Visual Studio中編寫(xiě)F#,將鼠標(biāo)指向某個(gè)值就會(huì)得到它的類型,編譯器可以通過(guò)函數(shù)體或其他方式的定義推斷出類型;Visual Studio是開(kāi)發(fā)F#的主要工具,51CTO推薦您閱讀Visual Studio 2010中關(guān)于F#的資源一文。

類型推斷(Type Inference)

我們說(shuō)數(shù)據(jù)的類型是被推斷出的,因?yàn)镕#的編譯期進(jìn)程會(huì)試圖根據(jù)變量自身的特點(diǎn)來(lái)判斷出它的類型并確保這種類型是安全的。盡管F#是強(qiáng)類型語(yǔ)言,但變量的類型聲明在類型的判斷推理過(guò)程中并不是必須的。

類型推斷有自身的優(yōu)點(diǎn)。在使用F#開(kāi)發(fā)一些大型應(yīng)用時(shí),比如.NET和Java開(kāi)發(fā)者都很熟悉的泛型特性(Generics)便是由類型推斷來(lái)完成。注意,F(xiàn)#編譯器會(huì)視任何沒(méi)有類型標(biāo)注的表達(dá)式為泛型。例如,下面的函數(shù)中,各變量的類型被定義(推斷為)泛型,即使程序編寫(xiě)者沒(méi)有定義任何類型。

  1. let f x =   
  2.     let y = g x  
  3.     h y 
  1. let f (x:’a) : ’b =  
  2.     let y:’c = (g:’a->’c) x   
  3.     (h:’c->’b) y 

F#小提示:在F#中,泛型類型參數(shù)是一個(gè)以撇號(hào)為前綴的字符。比如上面例子中的’b和’c就是最常用的泛型參數(shù)。像在.NET中一樣,泛型類型也可使用尖括號(hào)語(yǔ)法,比如“Dictionary<’Key,’Value>”。只有一個(gè)泛型參數(shù)的時(shí)候,你有時(shí)候會(huì)看到它使用‘前綴’語(yǔ)法而不是尖括號(hào)——最常見(jiàn)的是和F#泛型類‘list’和‘option’一起使用。比如“int list”和“list<int>”表達(dá)同一種功能,只是書(shū)寫(xiě)方式不同。

F#類型推斷機(jī)制

F#語(yǔ)言中的大多數(shù)類型推斷可以遵循以下兩條規(guī)則。首先,如果一個(gè)函數(shù)用于產(chǎn)生一個(gè)值,編譯器將假定該值的類型是函數(shù)需求的。第二,如果一個(gè)值是一個(gè)表達(dá)式的必然結(jié)果,這個(gè)值的類型是這個(gè)表達(dá)式所決定的。

有些情況下這些簡(jiǎn)單的規(guī)則不夠完全,編譯器必須需要類型聲明。比如,當(dāng)一個(gè)算數(shù)運(yùn)算符被使用,F(xiàn)#會(huì)處理的非常謹(jǐn)慎,如果沒(méi)有程序員的明確代碼,不會(huì)將一個(gè)數(shù)值型賦予另一個(gè)。這樣做是為了確保F#在進(jìn)行大規(guī)模數(shù)值計(jì)算時(shí),類型推斷不會(huì)加重編譯器的負(fù)擔(dān)。

針對(duì)第二條規(guī)則的例子在方法過(guò)載的情況下發(fā)生。比如Write方法在System.Console(.NET中System.Console封裝了基于控制臺(tái)應(yīng)用程序的輸入、輸出和錯(cuò)誤流操作)中有18個(gè)負(fù)載。類型推斷可以確定傳送給它的類型,但是無(wú)法確定另一個(gè)方向傳送的值的類型。

類型推斷不只是簡(jiǎn)單的符號(hào),它還可以用于程序功能的檢測(cè)。當(dāng)你寫(xiě)了一段代碼,類型推斷功能為這些代碼智能的獲得了指定的類型,這意味著錯(cuò)誤不會(huì)被引入程序。這種機(jī)制使F#獲得動(dòng)態(tài)語(yǔ)言的代碼簡(jiǎn)潔性的同時(shí)保證了完全靜態(tài)的類型系統(tǒng)。

更多關(guān)于F#的類型和語(yǔ)法基礎(chǔ)請(qǐng)參考:

F#數(shù)據(jù)類型:Discriminator Union

F#基本語(yǔ)法,模式匹配及List

F#的類型系統(tǒng)和類型推斷機(jī)制是學(xué)習(xí)和理解F#語(yǔ)言的基礎(chǔ),掌握了這些有利于我們之后的學(xué)習(xí)。下周我們將繼續(xù)F#的學(xué)習(xí),一起探究F#的基礎(chǔ)語(yǔ)法。

責(zé)任編輯:佚名 來(lái)源: 51CTO.com
相關(guān)推薦

2010-01-26 08:25:06

F#語(yǔ)法F#教程

2010-01-07 10:04:18

F#函數(shù)式編程

2009-08-13 17:39:48

F#數(shù)據(jù)類型Discriminat

2010-04-07 16:51:59

F#

2011-06-09 09:52:41

F#

2009-08-19 09:42:34

F#并行排序算法

2009-09-10 14:18:59

Functional F#

2009-11-16 09:05:46

CodeTimer

2009-12-04 09:16:44

Visual Stud

2012-11-06 10:01:35

ContinuatioF#

2010-03-26 19:22:08

F#代理

2009-12-14 09:04:10

F#運(yùn)算符

2009-08-27 09:16:48

F#中DSL原型設(shè)計(jì)

2009-08-13 17:25:21

F#入門(mén)

2009-12-11 13:59:35

F#

2010-07-09 14:12:00

ScalaF#C#

2012-03-12 12:34:02

JavaF#

2010-05-13 09:21:44

F#Visual Stud

2009-05-26 13:39:11

F#Visual Stud

2010-01-04 09:40:46

F#對(duì)象
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)