溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

F#初學筆記04

發(fā)布時間:2020-04-07 14:09:56 來源:網(wǎng)絡(luò) 閱讀:518 作者:cnn237111 欄目:編程語言
類型和類型推斷
F#是強類型語言,意味著你不能用整型參數(shù)傳給只接受string類型參數(shù)函數(shù)中。你必須顯式的轉(zhuǎn)換。F#的類型系統(tǒng)和常規(guī)的編程語言不同。F#中,所有的值都有類型,包括哪些是函數(shù)的值。

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

 
如果是標識符的值是函數(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<string>) = ["one"; "two"; "three"]
val doNothingToAnInt _int : int -> int
val intList : int list
val stringList : string list

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

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

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI