F# 越用越喜欢

最近由于需要,把遗忘了几年的F#又捡了起来。说捡了起来,倒不如说是从头学习,原来学的早已经忘了!所谓学过,只不过看过一本《F# 语言程序设计》 (郑宇军 凌海风 编著 --清华大学出版社)。对于编程书看的再多,不做项目也是没用,也不能正真理解其思想,只能停留在表面。另外,长时间不用也就忘了,F#就是这样。这次该真正用了,于是又花了几周时间从头学起,不用不知道,一用吓一跳!

对于使用多年C#语言从事.NET面向对象开发的人员来说,F#这种函数编程极其不习惯,不光是语法上不习惯,整个概念上跟C#都不一样。要只是语法不一样就简单了,难就难在要转变一个人思维习惯,要转变一个人思维是多难的一件事情呀!但要学F#就得必须转变。

1F# C# 的比较

实际上,F#代码比C#的代码要精简很多,一般说来,对同样的一段程序,使用F#编写要比使用C#编写代码要短。比如,要做一个交换两个数的一个函数。

C#:

public void Swap( ref int a, ref int b)

{

int temp = a

a = b;

b = temp;

}

F#:

let Swap (a, b) = (b, a)

C#用了3行语句,F#只用了一行。

有关F# 与 C# 的比较请参阅:http://blogs.msdn.com/b/timng/archive/2010/04/05/f-object-oriented-programming-quick-guide.aspx

2F#的最大特点

F#最大的一个特点是函数式编程,这跟面向对象编程很不一样。面向对象编程一切都一对象为原则,一切都以对象为基础,离开对象是万万不能的。函数式编程一切的基础都是函数,而且还可以是高阶函数。

下面是线性回归最小二乘法数据拟合的一个例子,输入参数是元组float * float:

let linearFit (data : (float * float) []) =

let xs, ys = Array.unzip data

let sumx, sumy = Array.sum xs, Array.sum ys

let sumx2 = Seq.sumBy (fun x -> x * x) xs

let sumxy = Seq.sumBy (fun (x, y) -> x * y) data

let m = (float data.Length)

let t = sumx2 / sumx

let a0 = (sumxy - t * sumy) / (sumx - t * m)

let a1 = (sumy - a0 * m) / sumx

fun x -> a0 + a1 * x

let ds = [| (-1.0, -5.0); (1.0, 2.5); (4.0, 12.5); (5.0, 16.0) |]

let f = linearFit ds

printfn "%A" (f 9.0)

由于linearFit函数最后一行返回的是一个线性函数:

fun x -> a0 + a1 * x

这样,可以使用这个线性函数f(x) = a0 + a1 * x

对于给定的x(比如 x = 9.0),可以求得f(x),例如:f(9.0) = 29.93956006

求最大值、最小值、累加,使用卷叠一次完成。假设我们需要求数组中最大值、最小值,并要完成所有元素的求和,这可能需要分几步来完成,但对于F#只需一步就能完成。

let agg (arr : float[]) =

Array.fold (fun (a, b, c) -> (max a x, min b x, c + x)) (-infinity, infinity, 0.0) arr

let x = agg [| 20.56; 78.15; 12.38; 6.21; 25.0; 0.75; 33.33; 66.67|]

F#另一大特点是异步和并行计算,这期不介绍,后期再介绍。

3F#C#的替代者吗?

现在是面向对象时代,面向对象编程成为主流,而F#是建立在.NET Framewok基础之上的,所以F#必然也具备了面向对象的特点。按理说,函数式编程比面向对象编程早很多年,F#既然是函数式编程,不应该有面向对象血统,但微软为了能充分利用广阔. 的NET资源,所以使F#也具备了面向对象特性,看下面代码:

type Student(id : string, name : string) =

let mutable age = 20

let mutable department = "数学系"

member s.Age

with get() = age

and set v = age <- v

member s.Department

with get() = department

and set v = department <- v

let s = new Student("1002001", "李明")

s.Age <- 24

Student是一个学生类,有年龄属性和系属性,那么这个类型,可以被C#调用。下面是C#代码使用F#的Student类的代码:

Student student = new Student();

student.Age = 24;

F#既有函数式编程的特点又有面向对象编程的特性,是不是F#就取代了C#了呢?答案不是的。应该说F#与C#是互补的关系,并不是取代的关系。使用C#实现的用F#基本都能实现。F#也能使用ADO.NET访问数据库,开发WinForm、ASP.NET WebForm程序、开发WPF程序,这些都没问题,但F#最善长的不是这些,而是科学计算或数值计算,就是说用F#实现一些算法比较合适,而不是开发界面和数据库等。如果用F#也做一些C#善长做额事情,那么F#就没有价值和意义了,何必还要新推出一套一样功能的F#呢?

4F#目前的不足

F#适合做科学计算,这跟Matlab、R等这些用语言有相同的地方,由于历史的原因Matlab、R资源库非常丰富,而F#的资源库很很少,这一点没法跟Matlab、R相比。但F#可以使用.NET资源库,这样能缓解一些。目前,使用F#的人远没有C#、Java那样多,特别是国内,使用F#真正做项目的人少之又少,这也妨碍了F#的发展。

下面是一些F#的资源链接,希望对您有用:

http://msdn.microsoft.com/zh-cn/library/dd233154.aspx

http://msdn.microsoft.com/zh-cn/vstudio/hh388569.aspx

http://blogs.msdn.com/b/dsyme/archive/2009/10/21/some-smaller-features-in-the-latest-release-of-f.aspx

http://fsharp.org/community/projects/

http://fsharp.org/technical-groups/

http://fsharp.org/guides/math-and-statistics/index.html

http://fsharp.org/guides/machine-learning/index.html

http://blogs.msdn.com/b/dsyme/archive/2011/02/27/support-vector-machines-svms-in-f-using-microsoft-solver-foundation.aspx

http://clear-lines.com/blog/post/Support-Vector-Machine-in-FSharp.aspx

http://clear-lines.com/blog/category/quantitative-modeling.aspx

F# 越用越喜欢的更多相关文章

  1. docker-compose是个好东西,越用越香

     回顾前文 前文演示了在单一容器中部署 Nginx和ASP.NET Core WebApp, 正在前文评论区某大牛指出的,容器化部署 nginx+ASP.NET Core 有更符合实战的部署选择:多容 ...

  2. CEO 系列之一:如何当好创业公司 CEO?(不要用战术的勤奋掩盖战略的懒惰,在创业过程中,最核心问题,就是能把创业情怀变成具体问题。这个问题越具体越好)

    1. 创业公司要先定一个目标,要善于把目标简化, 分解成一个, 一个更具体,更简单的问题2. 针对简单的问题进行聚焦, 做深做强3. 在做的过程中, 把断地推出自己的产品到市场上去试错, 要用事实来证 ...

  3. windows操作系统的电脑越用越卡?简说几种原因和解决方法。

    很多人在使用windows操作系统的发现电脑越用越卡,但是不知道什么原因,只知道电脑越便宜的越卡(电脑配置低), 然而导致电脑卡顿缓慢的原因有很多,总结出来就是软件和硬件的问题,那怎么办呢? 电脑系统 ...

  4. 90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(1)- JIT编译优化

    麻烦大家帮我投一票哈,谢谢 经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢? 面试的时候谈到 JVM,也有很多面试官喜欢问,为啥 Java ...

  5. 90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(2)- TLAB预热

    经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢? 面试的时候谈到 JVM,也有很多面试官喜欢问,为啥 Java 程序越执行越快呢? 一般人 ...

  6. Android手机越用越卡?

    一直不懂Android手机为什么会越用越卡,而ios就几乎能一直保持流畅度.后来发现这个锅不该google背,而是国内混乱的Android软件开发商的锅.主要是Android对应用没什么限制,而goo ...

  7. 【腾讯优测干货分享】越用越卡为哪般——如何降低App的待机内存(一)

    本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/1_FKMbi1enpcKMqto-o_FQ 作者:腾讯TMQ专项测试 ...

  8. OA办公系统功能真的越全越好?

    4.原文:http://www.jiusi.net/detail/472__776__4000__1.html 关键词:oa系统,OA办公系统 OA办公系统功能真的越全越好? 很多企业在选择OA办公系 ...

  9. 为什么Android手机总是越用越慢?

    根据第三方的调研数据显示,有77%的Android手机用户承认自己曾遭遇过手机变慢的影响,百度搜索“Android+卡慢”,也有超过460万条结果.在业内,Android手机一直有着“越用越慢”的口碑 ...

随机推荐

  1. NPOI心得

    一个Excel文件表示为一个IWookbook,Sheet是ISheet,其它细分为IRow,ICell. 2003和2007版本为IWookbook接口的不同实现:HSSFWookbook和XSSF ...

  2. Swift中子类必须包含的构造器和析构器

    import Foundation /* Swift中子类必须包含的构造器 1.Swift允许在父类构造器前添加required关键字, 用于声明所有子类必须包含该required构造器 (如果没有声 ...

  3. 使用angularjs中ng-repeat的$even与$odd属性时的注意事项

    JavaScript中数组的索引是从0开始的,因此我们再取奇偶的时候需要用!$even和!$odd来将$even和$odd的布尔值反转 下面给出一个实例: 使用$odd和$even来制作一个红蓝相间的 ...

  4. (一)HTML5 - pushState 无刷新更新地址

    可以解决什么问题: 可以实现网页的ajax加载,同时又能完成URL的改变而没有网页跳转刷新的迹象,就像是改变了网页的hash(#)一样. 优于hash: 避免了改变hash的问题,避免了用户不理解UR ...

  5. 【转】C++中的位拷贝与值拷贝

    [转]http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以String类为例: 首先定义String类,而并不实现其成员函数. ...

  6. HTML5 Canvas基础知识

    HTML5画布 1.创建一个画布         <canvas id="myCanvas" width="200" height="100&q ...

  7. ECSTORE 货币格式

    世界上许多国家都有不同的货币 格局和数字 格局 特例 .针对特定的当地化环境正确地 格局化和显示货币是当地化的一个主要部分,ecstore 可以同过后台的设置,来更改货币的格式,具体方式为 后台-&g ...

  8. jQuery插件autoComplete使用

    安装/需要引入的文件 <script type="text/javascript" src="../js/jquery-1.8.3.min.js.js"& ...

  9. poj1740 A New Stone Game

    题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆. 真是好♂题,代码不长就是好♂题. 首先考虑两堆相同的 ...

  10. Smartcard CA智能卡之调试

    Integrated Circuit Card  集成电路卡,也叫CA卡或智能卡,将一个微电子芯片嵌入符合ISO 7816标准的卡基内,做成卡片形式,也是一个嵌入式小系统.由CPU,ROM,RAM及E ...