F#教程:函数 - 面向对象网 f# 学习 对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > F# > 正文

F#教程:函数

来源: www.bianceng.cn 阅读:

数据类型说了好几回了,有点烦了吧?这回我们就换个角度,学习下函数吧!

有两个两个输入参数并返回它们的和的简单函数如下:

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

Tags:
相关文章列表: