编程语言的发展趋势及未来方向(3):函数式编程(转) (3)

还有一点,这段代码里我没有提供任何的类型信息。当我把鼠标停留在方法上时,就会显示sumSquaresI方法接受一个int序列作为参数并返回 一个int。你可能会想int是哪里来的,嗯,它是由类型推断而来的。编译器从这里的0发现acc必须是一个int,于是它发现这里的加号表示两个int 的相加,于是sqr函数返回的是个int,再接下来blablabla……最终它发现这里到处都是int。

编程语言的发展趋势及未来方向(3):函数式编程(转)

如果我把这里修改为浮点数0.0,鼠标再停留一下,你就会发现这个函数接受和返回的类型都变成float了。所以这里的类型推断功能十分强大,也十分方便。

编程语言的发展趋势及未来方向(3):函数式编程(转)

现在我可以选择这个函数,让它在命令行里执行,然后调用sumSquaresI,提供1到100的序列,就能得到结果了。

let rec sumSquaresF l =
match l with
| [] -> 0
| h :: t -> sqr h + sumSquaresF t

那么现在我们来换一种函数式的风格。这里是另一种写法,可以说是纯函数式的实现方式。如果你去理解这段代码,你会发现有不少数学的感觉。这里我定义 了sumSqauresF函数,输入一个l列表,然后使用下面的模式去匹配l。如果它为空,则结果为0,否则把列表匹配为头部和尾部,然后便将头部的平方 和尾部的平方和相加。

你会发现,在计算时我不会去改变任何一个变量的值,我只是创建新的值。我这里会使用递归,就像在数学里我们经常使用递归,把一个公式分解成几个变化的形式,以此进行递归的定义。在编程时我们也使用递归的做法,然后编译器会设法帮我们转化成尾递归或是循环等等。

于是我们便可以执行sumSquaresF函数,也可以得到相同的结果。当然实际上可能你并不会像之前这样写代码,你可能会使用高阶函数:

let sumSquares l = Seq.sum (Seq.map (fun x -> x * x) l )

例如这里,我只是把函数x乘以x映射到列表上,然后相加。这样也可以得到相同的结果,而且这可能是更典型的做法。我这里只是想说明,这个语言在编程时可能会给你带来完全不同的感受,虽然它的执行期特征和C#比较接近。

这便是关于F#的内容。

(未完待续)

相关文章

编程语言的发展趋势及未来方向(1):历史回顾及趋势概述

编程语言的发展趋势及未来方向(2):声明式编程与DSL

编程语言的发展趋势及未来方向(3):函数式编程

编程语言的发展趋势及未来方向(4):动态语言

编程语言的发展趋势及未来方向(5):元编程

编程语言的发展趋势及未来方向(6):并发

编程语言的发展趋势及未来方向(7):总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsfxz.html