真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

F#初學(xué)筆記04

類型和類型推斷
F#是強(qiáng)類型語言,意味著你不能用整型參數(shù)傳給只接受string類型參數(shù)函數(shù)中。你必須顯式的轉(zhuǎn)換。F#的類型系統(tǒng)和常規(guī)的編程語言不同。F#中,所有的值都有類型,包括哪些是函數(shù)的值。

 
通常,不需要顯式的聲明類型,編譯器根據(jù)值能推斷出類型。如果一切OK,編譯器會保持這樣的類型推斷。如果類型類型有錯誤,編譯器會報錯。VS開發(fā)中,可以把鼠標(biāo)指針懸浮在標(biāo)識符上查看類型。
let aString = "Spring time in Paris"
let anInt = 42
這兩個標(biāo)識符的類型很直白簡單
val makeMessage : int -> string
val half : int -> int

 
如果是標(biāo)識符的值是函數(shù),如
let makeMessage x = (Printf.sprintf "%i" x) + " days to spring time"
let half x = x / 2
類型則如下,注意前面還是val,表示函數(shù)仍然也是值:
val makeMessage : int -> string
val half : int -> int
第一個類型表示輸入整型返回string
第二個類型表示輸入整型返回整型

 
如下的定義
let div1 x y = x / y
let div2 (x, y) = x / y
let divRemainder x y = x / y, x % y
類型如下
val div1 : int -> int -> int
val div2 : int * int -> int
val divRemainder : int -> int -> int * int

 
第一個表示參數(shù)可以各自輸入
第二個用了*號,表示參數(shù)是一個二元的元素,包含2個整型的元素作為單獨的輸入?yún)?shù)。
第三個的類型是int -> int -> int * int,輸入的是兩個int,返回的是一個元組。
let doNothing x = x
val doNothing : 'a -> 'a
上面的代碼看似什么也沒做,但是它的類型是'a -> 'a。表示接受一個類型,返回的是同樣的類型。任何由單引號(')前綴的類型,都是變量類型(variable type)。
F#有一種類型是obj,對應(yīng)的是System.Object,表示任何類型的值,概念和CLR中的System.Object差不多。但是變量類型(variable type)不是這樣的,注意,->兩端都是'a,意思是編譯器目前還不知道到底是什么類型。只知道返回的類型和輸入的類型是一致的。這個特征也稱作類型參數(shù)化,使得編譯器在編譯期間發(fā)現(xiàn)更多類型錯誤,避免轉(zhuǎn)型。

 
變量類型(variable type),或者稱做類型參數(shù)化,它的概念和CLR2.0中泛型概念相近。F#的創(chuàng)立者Don Syme,在創(chuàng)立F#之前,就設(shè)計和實現(xiàn)了.NET CLR中的泛型。有人猜測可能正是由于他縣創(chuàng)建了泛型,才能創(chuàng)建F#。
let doNothingToAnInt (x: int) = x
let intList = [1; 2; 3]
let (stringList: list) = ["one"; "two"; "three"]
val doNothingToAnInt _int : int -> int
val intList : int list
val stringList : string list

 
doNothingToAnInt函數(shù),演示了被約束的值,類型約束。參數(shù)x限制為int類型。我們不僅僅只在函數(shù)參數(shù)中,也可以限制任何標(biāo)識符為一種類型。
stringList演示了如何限制一個不是函數(shù)參數(shù)的標(biāo)識符。

 
限制值類型的語法很簡單,加個括號,后面跟冒號(:),冒號后是參數(shù)名,這也稱做類型標(biāo)記。
intList的值是一個整型的list,標(biāo)識符的類型是 int list。表示編譯器已經(jīng)識別出這個list只包含整型,把其他類型加入這個list都會導(dǎo)致編譯錯誤。
stringList有一個類型標(biāo)記,因為編譯器可以從value中解析出類型,所以這不是必須的。這樣的寫法使得F#看起來類似于.NET庫中的泛型類型。也可以用這種寫法 stringList : string list

分享標(biāo)題:F#初學(xué)筆記04
URL分享:http://weahome.cn/article/gidecp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部