F#入門學習(五)

前面幾個講的是基礎知識和基本類型,現在開始講的是F#的庫。
什麼是庫?我個人的理解是:沒學之前,你無論實現什麼功能都得自己寫,舉個 例子,你寫了一個機器人手舞足蹈的程序,寫完之後看他跳舞,結束了。有天你又想看機器人跳舞,就又得寫一個了。於是F#就說,你看,不就是機器人跳舞嘛,我們專門寫一個機器人的代碼,這段代碼放在我這,誰想看機器人跳舞也別寫代碼了,直接調用我的機器人就好了。這個機器人代碼就是庫。

  1. 輸出的庫有兩個,一個printfn一個.net
    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#方法,沒有()
    
    //但是都有“ ”,而且前者直接用0 1 表示參數,後者是用佔位符。
    //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#的庫較爲安全
  2. 命名空間
    你家有隻貓叫咪咪,別人家也有隻貓叫咪咪,別人想擼你家貓怎麼辦?
    不要直接喊咪咪,要說:小可愛家的咪咪,王二狗家的咪咪走開。
    前面誰誰家,就是所謂的命名空間。
    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
    
  3. 那什麼是類型type,什麼又是模塊moudle?
  • 模塊:比如你家養了不只一隻貓,每次想擼貓怎麼辦呢?
    注意:你家是命名空間,那麼接下來的操作就可以理解爲模塊了。
    把你家的貓分類關在不同的房間裏。房間就是模塊。
    小可愛家的101房間的花花就是一個很好的擼貓選擇。
  • 類型:類型可以是純數據類型,可以是類,還可以嵌套,就是你想做什麼做就可以了。
  1. 總結一下:
    命名空間裏面可以有:模塊和類型、類
    模塊裏面可以有:子模塊、類型、或者類、或者值、函數
    類型裏面可以有:值和類
    值:無

    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,那麼默認模塊名就是文件名,就符合標準了。

  2. 有時候這些名字很長,難道用一次寫一次嗎?
    不用,我們可以使用open語句把命名空間打開,後面再使用的時候就可以直接省略了。
    系統爲了方便人們使用一些常見的的命名空間,默認打開了很多,比如:
    Microsoft.Fsharp.Core
    Microsoft.Fsharp.Core.Operators
    Microsoft.Fsharp.Collections
    Microsoft.Fsharp.Control
    Microsoft.Fsharp.Text
    等等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章