F# 越用越喜欢

 

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

时间: 2024-10-10 09:39:36

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

为什么代码越写越复杂

代码复杂程度可以用"熵"来表示,"熵"是物理学中的概念, 表示所有"无序"的总和, 尽管软件开发不受任何物理定律的约束,然而熵对软件开发的影响非常之大, 当代码中的无序增长到一定程度时,代码复杂到了程序员难以掌控, 软件就"腐烂"了. 追本溯源,导致软件腐烂的原因其实并不复杂, 跟我们现实世界中的方方面面有着密切的关系. 随便拿一则经常被报道的新闻事件来说 国外某处著名旅游景点的墙壁上被中国游客刻满了" xxx到此一

深圳滑坡获救者:绝望时想着打游戏 越想越精神

在五楼宿舍睡觉的田泽明,几秒钟之内被泥山吞没了. 接下来是67小时的黑暗——一把椅子顶住了半截水泥板. 被困不到半小时,田泽明又受打击:和他一起被埋的室友曹建鹏没了声息:不幸之中有万幸,他摸到了半瓶矿泉水.一大包绿瓜子.一打口香糖.一两份像柚子的小水果.六包感冒冲剂. “我知道我一定可以出去.”田泽明总结,灾难中能让你自救的,有运气.心理.科学的方法,最后是意志力. 田泽明,21岁,重庆巫山人,德吉程精密五金有限公司员工.初中毕业一年后,曾辗转上海.江苏等地打工,两个月前来到深圳.2015年12

梦想这东西和经典一样,时间越久越显珍贵

昨天收到社科院的录取通知,本以为会激动得哭,相反却很平静,可以说是欣喜之外,也是预料之中. 知道为什么做比知道怎么做更重要 考研成功,不是我比别人准备得早,比别人更努力,也谈不上什么考研经验,只是更清楚自己为什么要这样做而已.决定考研是在2年前,我的本科专业是信管,考研的专业是国际政治,很多人会说你找死吧,专业跨度这么大,还去考这个专业最好的学校.嗯,对于不清楚自己梦想的人来说是在寻死,对于有梦想的人来说是在寻梦.我的梦想是做一名外交官,两年前的时候才发现了这个梦想,当时看来也遥不可及,但一旦知

善良的力量可以像滚雪球,越滚越大

未经许可,谢绝任何形势的转载 每个人心中都住着一个善良的孩子 不久前腾讯新闻推送了的一则比较老的新闻,主人公的名字叫凯瑟琳.新闻中大致说了她在2006年做的一件影响很大的事情:帮助非洲儿童远离疟疾(念nue),拯救了上百万个小生命.我很喜欢这种天真善良的小朋友,我们一起来看看她的故事. 凯瑟琳出生在美国田纳西州一个幸福的家庭,妈妈是一个家庭妇女,爸爸安东尼是一个健身教练. 2006年4月初的一天,那时候凯瑟琳才5岁,她正在看电视的时候,看到非洲纪录片,纪录片正讲述非洲每30秒就会有一个小孩子死去

钱,越花越有,越省越穷

生活的怪圈 越花钱的人越有钱,越舍不得花钱的人却越穷!为什么会是这样?我想还是思维视角的问题. 不喜欢花钱的人总在想,等以后钱攒多了再消费,想的都是等有钱了以后怎么怎么样. 从小我们接受的教育都是钱是省下的,越会节俭的人,越有钱. 其实,那是计划经济的产物.那个时候,每个人获取的都是定额的财富,唯有节约,才会余下更多. 斗转星移,如今,人们的财富来源多元化,赚钱的概念已经覆盖了省钱的意识. 但我们的生活中,节俭的人太多. 他们把能省的都省下,能少开支就少开支,能存银行就存银行,存银行的钱,可以说

备战双11,快递的路为啥越走越窄?

现在,中国电商界最具话题性的事件莫过于双十一,不,应该是双11.自从霸道总裁注册了这个节日的商标之后,其他企业就只能用"双11"或者"Double eleven"等相对二逼的说法了.不知道,我们再说11月11日是光棍节,会不会也遭到起诉呢?坦白讲,虽然双十一期间能买点便宜货,笔者并不支持电商人造节日的营销手段,尤其是用"半价"这样的噱头来催肥一个销售狂潮.从理念上来讲,双十一再次把中国人的劣根性曝露出来,恶狠狠地嘲弄和讽刺,更现实的问题在于,在全

酸奶虽好也有禁忌 酸奶不是越稠越好

酸奶虽然有很多养生功效,对女人而言更是好处多多,但是喝酸奶也是有禁忌的,下面就赶紧和小编一起来看一下吧 禁忌一.酸奶不是越稠越好 很多消费者认为酸奶越稠越好,但其实很多很稠的酸奶只是因为加入了各种增稠剂,如羟丙基二淀粉磷酸酯.果胶.明胶,过多的增稠剂虽然满足了口感,但对身体并无益 禁忌二.只能冷藏不能加热 很多人知道酸奶里千千万万的“菌”是好东西,但却不知道如何留住它们.南庆贤教授介绍,在酸奶刚生产出来时,里面都是活菌,只有冷藏才能将活菌很好地保留下来.还有人喜欢把酸奶热了喝,这种做法更是暴殄天

一个人越活越好的七个迹象,后半生更从人的内蕴中体现出来

一个人的生活有了信念,才能昂首前行.勇攀高峰和气度非凡. 人生最不缺少的就是变故,以惊恐心视之,则心绪不宁:以平常心视之,则波澜不惊. 网上分享了一个人最好的状态是什么样的. 无非就是:眼里写满故事,脸上却不见风霜.每天笑意满满,自信温和,不羡慕谁,也不嘲笑谁. 把日子过得越来越好的人,都有这七点相似的人生智慧. 想要越活越好,首先要发自内心地认可自己,喜欢自己. 01扬在脸上的自信 想要越活越好,首先要发自内心地认可自己,喜欢自己. 碰到比别人好的方面,不骄不躁.不随意攀比:遇到不如别人的地方

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

 回顾前文 前文演示了在单一容器中部署 Nginx和ASP.NET Core WebApp, 正在前文留言中某位大牛指出的,容器化部署 nginx+ASP.NETcore 有更生产化的部署选择, 这次我们会演示利用 docker-compose 创建两个独立的容器 部署企业级应用. 本文会讲述企业级示例项目中用到的 docker volume.docker network.redis.sqlite.docker HealthCheck 等相关知识, 略去CentOS平台基本操作.Linux 下安