前面幾個講的是基礎知識和基本類型,現在開始講的是F#的庫。
什麼是庫?我個人的理解是:沒學之前,你無論實現什麼功能都得自己寫,舉個 例子,你寫了一個機器人手舞足蹈的程序,寫完之後看他跳舞,結束了。有天你又想看機器人跳舞,就又得寫一個了。於是F#就說,你看,不就是機器人跳舞嘛,我們專門寫一個機器人的代碼,這段代碼放在我這,誰想看機器人跳舞也別寫代碼了,直接調用我的機器人就好了。這個機器人代碼就是庫。
- 輸出的庫有兩個,一個printfn一個.net
//但是都有“ ”,而且前者直接用0 1 表示參數,後者是用佔位符。let add x y = x + y let x1 = add 10 20 let x2 = add 100 200 System.Console.WriteLine("x1 = {0},x2 = {1}",x1,x2)//.net方法,參數用()包裹起來 printfn"x1 = %d,x2 = %d"x1 x2//F#方法,沒有()
//x1 = 30,x2 = 300
//x1 = 30,x2 = 300
//val add : x:int -> y:int -> int
//這些是.net庫調用的結果
//val x1 : int = 30
//val x2 : int = 300
//val it : unit = ()
//這是F#調用的結果
看上面的黑體字,可知F#庫提供了類型檢查功能,.net庫就沒有,所以一般使用F#的庫較爲安全 - 命名空間
你家有隻貓叫咪咪,別人家也有隻貓叫咪咪,別人想擼你家貓怎麼辦?
不要直接喊咪咪,要說:小可愛家的咪咪,王二狗家的咪咪走開。
前面誰誰家,就是所謂的命名空間。
上面第一行是命名空間,空間裏面有類型,還有模塊,這些東西也是有一定的自由性的,可以定義屬於自己的東西。namespace mynamespace//顯示定義命名空間 type MyMethod1 = //全稱是 mynamespace.MyMethod1 member this.Name = "名稱1" //全稱是 mynamespace.MyMethod1.Name module Module1 = //全稱是 mynamespace.Module1 let Name = "名稱2" //全稱是 mynamespace.Module1 .Name
那如果我們直接就想定義一個模塊不想那麼麻煩呢?
可以直接定義模塊,後面把誰誰的模塊說清楚就可以了。
專業名詞叫:使用_命名空間限定詞_隱式定義命名空間—再對模塊聲明module myNamespace1.myMoudle //直接定義模塊,空間是myNamespace1 let myFun x y = printfn"%a %a"x y
- 那什麼是類型type,什麼又是模塊moudle?
- 模塊:比如你家養了不只一隻貓,每次想擼貓怎麼辦呢?
注意:你家是命名空間,那麼接下來的操作就可以理解爲模塊了。
把你家的貓分類關在不同的房間裏。房間就是模塊。
小可愛家的101房間的花花就是一個很好的擼貓選擇。 - 類型:類型可以是純數據類型,可以是類,還可以嵌套,就是你想做什麼做就可以了。
-
總結一下:
命名空間裏面可以有:模塊和類型、類
模塊裏面可以有:子模塊、類型、或者類、或者值、函數
類型裏面可以有:值和類
值:無namespace library1//命名空間 //類型定義,顏色一定要大寫,小寫不對 type color = //全稱是library1.color |Red |Green |Blue //類定義 type Type0() = ////全稱是library1.Type0 member type0.method1() = //類成員 printfn"test.method1" member type0.method2() = printfn"test.method2" //局部模塊定義,至於局部是什麼,下面會講 module Module1 = //局部模塊是要寫=的,全局模塊是不寫=的,可以對比上面加紅(內聯代碼塊) let function1 x = x + 1 //全稱是library1.Module1.function1 type Type1() = //同樣是類定義,但是這裏屬於模塊 Module1的,與上面不同,全稱爲:library1.Module1.Type1 member type1.method1() = printfn"test1.method1" member type1.method2() = printfn"test1.method2" type InterfaceType1 = //同樣是類定義,還是屬於模塊 Module1的,但是是接口類型,全稱爲:library1.Module1.InterfaceType1 abstract member method1: int->int abstract member method2: string->int
VS中的項目必須使用module開頭,否則報錯,可是,我們學到現在沒有用module也沒有報錯呀?那是因爲,如果項目只有一個文件,也沒有使用module,那麼默認模塊名就是文件名,就符合標準了。
-
有時候這些名字很長,難道用一次寫一次嗎?
不用,我們可以使用open語句把命名空間打開,後面再使用的時候就可以直接省略了。
系統爲了方便人們使用一些常見的的命名空間,默認打開了很多,比如:
Microsoft.Fsharp.Core
Microsoft.Fsharp.Core.Operators
Microsoft.Fsharp.Collections
Microsoft.Fsharp.Control
Microsoft.Fsharp.Text
等等