数据类型说了好几回了,有点烦了吧?这回我们就换个角度,学习下函数吧!
有两个两个输入参数并返回它们的和的简单函数如下:
let Add a b = a + b
这就是函数的定义。同样使用了声明变量时的let。
确实感觉很神奇,没有了C#语言那样的冗长。看了这个定义后,有点感觉C#是冗长的语言。调用函数的代码如下:
let c = Add 10 20
printfn "%d" c
其中,由于不使用括号有点怪怪的感觉。完整的程序如下:
#light
let Add a b = a + b
let c = Add 10 20
printfn "%d" c
对于这些代码,C#和VB.NET编程的人可能感到有些奇怪。有些无法理解什么是函数定义和函数调用。
上述代码如果用C#代码改写应该是这样的:
static void Main(string[] args) {
Func<int,int,int> Add = (a, b) => a + b;
var c = Add(10, 20);
Console.WriteLine("{0}",c);
}
F# 函数有点和C#的delegate相类似吧。不过可不能写成这样:
#light
let c = Add 10 20 // Error:Can not fine Add
printfn "%d" c
let Add a b = a + b
其中,由于无法找到Add声明,就会出现编译错误。
这次,我们定义个求3个数平均值的函数:
let Mean a b c = (a + b + c) / 3.0
调用代码如下:
printfn "%f" (Mean 10 20 30)
不好,有个编译错误:The type 'float' does not match the type 'int'.
原因还不是很明白,个人推测如下:
调用时,Mean的参数类型就确认了。
这样就成为了 int/double的运算。
类型不一样,因此无法计算。
出现了编译错误。
这样看来,比C#的类型检查还严格啊。通过下面的这个例子我们就可以理解类型检查的严格了。
let a = 10 + 1.5
还是有错误, 因为类型不一样不能运算。 如下修改后就可以了:
let Mean a b c = double (a + b + c) / 3.0
其中,我们知道了新的东西。上述double就是作为类型转换运算符。
F#中,double是float的别名(大概是),用float替换double也会有同样的结果。
比如,以下的代码是OK的。(引用了http://code.msdn.microsoft.com/fsharpsamples的部分代码)
let pi1 = float 3 + 0.1415
let pi2 = double 3 + double 0.1415
printfn "pi1 = %f, pi2 = %f" pi1 pi2
let i1 = int 3.1415
let i2 = int64 3.1415
printfn "i1 = %d, i2 = %d" i1 i2
let byteA = byte (3+4)
printfn "byteA = %d" byteA
结果是:
pi1 = 3.141500, pi2 = 3.141500
i1 = 3, i2 = 3
byteA = 7