前面几个讲的是基础知识和基本类型,现在开始讲的是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->intVS中的项目必须使用module开头,否则报错,可是,我们学到现在没有用module也没有报错呀?那是因为,如果项目只有一个文件,也没有使用module,那么默认模块名就是文件名,就符合标准了。
-
有时候这些名字很长,难道用一次写一次吗?
不用,我们可以使用open语句把命名空间打开,后面再使用的时候就可以直接省略了。
系统为了方便人们使用一些常见的的命名空间,默认打开了很多,比如:
Microsoft.Fsharp.Core
Microsoft.Fsharp.Core.Operators
Microsoft.Fsharp.Collections
Microsoft.Fsharp.Control
Microsoft.Fsharp.Text
等等
本文深入浅出地介绍了F#编程语言的基础知识、库的概念及其应用,通过实例讲解了如何利用F#库简化代码编写,提升程序安全性。同时,文章详细解释了命名空间、模块、类型等核心概念,并探讨了它们在实际编程中的作用。
869

被折叠的 条评论
为什么被折叠?



