F#是一种简洁、高效、富于表现性的函数式的及面向对象的程序设计语言。它是基于Ocaml的,而Ocaml是基于ML函数程序设计语言的。
F#自2002年开始研发,2005年发布了第一个版本,2007年底正式从研发专案转移至产品部门,并决定将F#置入Visual Studio.NET 2010。截止目前(2009年1月6日现在),最新的F#预览版为F# September 2008 CTP,版本号为1.9.6.2。
F#也许终将成为程序核心部分设计的首选,而C#与VB等将在用户界面交互设计方面继续发挥其强大的潜力。
更多详细介绍可以去微软F#研究中心网站上浏览到:
http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/default.aspx
下面我们初步感受一下F#语言:
1。我的IDE环境是vs2010beta2,首先我们在vs中新建一个F# Application的工程。F#新建之后源文件是一片空白,可能看惯了C#的看着这个还真有点不习惯这么空,我刚开始就是。F#的源文件后缀名为.fs。
2。老一套,来一段hello world!输入代码:
System.Console.WriteLine("hello World!")
按Ctrl+F5运行一下看看。
使用关键字let申明变量,及变量的使用
let anInt = 5
let aString = "Hello"
// 下面是通过计算将值赋给anIntSquared
let anIntSquared = anInt * anInt
我们可以将这段代码选中,点击鼠标右键选择Send to Interactive可以在vs下面的交互窗口看到上面代码的赋值结果
val anInt : int = 5
val aString : string = "Hello"
val anIntSquared : int = 25
最后我们还是利用命令将他们在程序结果里面输出吧,输入以下代码:
System.Console.WriteLine(anInt)
System.Console.WriteLine(aString)
System.Console.WriteLine(anIntSquared)
按Ctrl+F5运行以下,我们就可以看到结果了。
定义和使用函数
依然是利用关键字let来定义函数的,下面我们定义一个函数,输入代码:
//square就是函数名,n是它的一个参数,该函数完成的任务就是求平方
let square n = n * n
下面我来调用这个函数,输入代码:
//i是存放结果的变量,anInt是上面我们定义的变量,值为5,计算结果为25
let i=square anInt
最后我们输出这个i来看看:
System.Console.WriteLine(i)
注意:是递归函数的要加关键字let rec,不然的话会在函数调用内部提示你该函数未定义,下面定义的是一个递归函数:
let rec factorial n =
if n = 0
then 1
else n * factorial (n - 1)
System.Console.WriteLine(factorial anInt)
创建集合:数组及lists的使用
数组一般这样进行定义的:
let point=(1,2,5)
System.Console.WriteLine(point)
不过F#里的数组还可以不同类型的值都放一起,比如这样使用也可以
let dataB = (1, "fred", 3.1415)
System.Console.WriteLine(dataB)
再介绍另外一种集合类型list
let pointB=[1,3,5]
System.Console.WriteLine(pointB)
相对数组而言只是定义的时候用中括号来代替小括号了,但list用途相对数组更灵活,比如可以这样来定义一个从1到10的整数集合
let dataC=[1..10]
System.Console.WriteLine(dataC)
这是你按Ctrl+F5可能会发现我们的dataC列表并没有全部输出,但没关系,1到10的整数的的确确已经存进dataC里了,我们换个
输出方式可以看到,
printfn "%A" dataC
关键字printfn也是一个输出语句,不过它只能输出单个变量的值或者结构
定义及使用类
下面我们来定义一个类
type MyClass(name:string,age:int)=
//使用mutable关键字可以定义局部的值可变的变量
let mutable internalAge = age
//此处相当于再定义一个只传一个参数的构造函数,只有一个name参数时,第二个参数默认为0
new(name:string)=MyClass(name,0)
//member关键字用来声明类中的属性,方法,事件等作用
//这里是进行属性的定义,就跟C#里属性定义差不多,以下是定义一个只读的属性
member this.Name = name
//这里是定义一个可读可写的属性
member this.Age
with get() = internalAge
and set(value) = internalAge <- value
//这是定义一个方法
member this.HasABirthday () = internalAge <- internalAge + 1
//检查当前年龄和目标年龄谁大
member this.IsOfAge targetAge = internalAge >= targetAge
//重载ToString()函数,用来显示结果
override this.ToString () =
"Name: " + name + "/n" + "Age: " + (string)internalAge
我们将这个类进行实例化看下运行结果
//类的实例化
let MyClass1 =MyClass("heqichang",24)
let MyClass2=MyClass("momo")
//使用这种方法来给变量赋值
MyClass2.Age <- 15
//调用类中的方法
MyClass1.HasABirthday()
//输出结果
System.Console.WriteLine(MyClass1.ToString())
System.Console.WriteLine(MyClass2.ToString())
System.Console.WriteLine(MyClass2.IsOfAge(18))