您的位置:首页 > 其它

F#程序设计-F#语言基础之剖析一个F#程序

2009-12-11 08:59 411 查看
现在,通过前面的系列介绍,你可能想知道怎么把在FSI交互中的输入的F#代码转换成一个F#程序,但事实上,你在前看看到的每个每个代码片段都是一个全面的项目。

大多数其他语言,如C#,需要一个明确的程序入口点,通常称为main方法,然而我们的F#程序迄今尚未定义任何特殊的标记,表明该程序应开始,在F#,单文件应用中代码文件的内容执行顺序是从上到下的,这个跟C语言有点类似,就是如果在一个函数中调用本代码文件内的另外一个函数,则这个函数一定要在本身的上面已经被定义了。对于多文件的项目,代码可以按照需要将其组织划分到模块或命名空间。



Modules

到目前为止,我们所有的代码都写在一个模块内,默认情况下,F#的模块名称是你的代码文件名称,并且首写字母是大写,如果你没有定义模块的话。所以,如果你有一个值命名value1,和你的代码file1.fs,您可以使用它通过使用完全限定路径:File1.value1。



模块创建

你可以在你的代码文件顶部明确利用module关键字来制定你的代码模块,指定之后,每一个值、函数、类型定义都属于这个模块内:

module Utilities =
let x = 1
let sizeOfFolderPiped folder =
let getFiles folder =
Directory.GetFiles(folder, "*.*", SearchOption.AllDirectories)

let totalSize =
folder
|> getFiles
|> Array.map (fun file -> new FileInfo(file))
|> Array.map (fun info -> info.Length)
|> Array.sum
totalSize

type MyClass() =
let m_x:int = 10
let m_y:int = 20



模块嵌套

模块内也可以包含嵌套,要申明一个模块嵌套,跟定义一个模块一样,在已经存在的一个模块内利用module关键字再定义一个模块,嵌套模块必须缩进被义性的“顶级”模块:

module Utilities =
let x = 1
let sizeOfFolderPiped folder =
let getFiles folder =
Directory.GetFiles(folder, "*.*", SearchOption.AllDirectories)

let totalSize =
folder
|> getFiles
|> Array.map (fun file -> new FileInfo(file))
|> Array.map (fun info -> info.Length)
|> Array.sum
totalSize
// 嵌套模块
module types =
type MyClass() =
let m_x:int = 10
let m_y:int = 20



Namespaces

除了模块外,还有一种组织代码的模式,就是命名空间(namespaces),命名空间是一种组织代码的单元就像模块一样, 唯一的区别在于,命名空间不能包含值和函数,仅仅只能定义类型。此外,命名空间也不能像模块样嵌套,不过可以在一个代码文件内添加多个命名空间:

namespace PlayingCards
// PlayingCard.Suit
type Suit =
| Spade
| Club
| Diamond
| Heart

// PlayingCards.PlayingCard
type PlayingCard =
| Ace of Suit
| King of Suit
| Queen of Suit
| Jack of Suit
| ValueCard of int * Suit

namespace PlayingCards.Poker
// PlayingCards.Poker.PokerPlayer
type PokerPlayer = { Name : string; Money : int; Position : int }

在F#中,模块是一种快速模型并迅速解决方案的一个捷径,命名空间,则主要面向大型项目与面向对象解决方案。



Program Startup

在F#,程序开始执行在最后一个代码文件的顶部,通常情况下,在用VS 2010创建一个项目是,默认情况下会创建program.fs文件,这个就可以用来作为我们程序开始执行的地方,考虑这个简单由一个代码文件组成的F#程序:

// Program.fs
let numbers = [1 .. 10]
let square x = x * x
let squaredNumbers = List.map square numbers
printfn "SquaredNumbers = %A" squaredNumbers
open System
printfn "(press any key to continue)"
Console.ReadKey(true)

现在在Visual Studio 2010中打开一个项目,然后添加一个新的空F#代码文件,当你按F5运行这个程序时,什么也不发生,这是因为在项目中新增加的一个空白文件的位置在Program.fs文件的后面,空白文件什么代码都没有,所以就不会运营程序了,在一个多文件的F#项目中,代码文件的顺序很重要,特别是一个代码文件需要引用到另外一个代码文件的时候,如果引用的那个代码文件在别引用的后面,那么将会一个未定义错误。在Visual Studio 2010调整代码文件的顺序,可以在解决方案中,鼠标选择需要调整的文件,在右键菜单中选择"Move Up"或者"Move Down":



较正式的程序启动语法,你使用[<EntryPoint>]属性来定义一个main方法,并且main方法必须符合以下几点:

1、必须是是在项目中最后一个被编译的文件中的最后一个函数,确保在F#程序中不存在启动混乱

2、方法的参数必须定义一个string类型的数组,跟C#中的一样。

3、返回一个整数,这是你的程序的退出代码。

为了使主要方法明确, 你可以重写以前的那个程序像下面这样:

// Program.fs
open System
[<EntryPoint>]
let main (args : string[]) =
let numbers = [1 .. 10]
let square x = x * x
let squaredNumbers = List.map square numbers
printfn "SquaredNumbers = %A" squaredNumbers
printfn "(press any key to continue)")
Console.ReadKey(True) |> ignore
// Return 0
0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐