F#教程:函数


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

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

  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


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3