F#入门学习(五)

本文深入浅出地介绍了F#编程语言的基础知识、库的概念及其应用,通过实例讲解了如何利用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
    等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值