将函数式编程引入您的开发环境[关闭]


15

这是一个漫长的故事,但我会尽力总结一下。我们是.NET商店,专门为各种不同类型的基金编写软件。例如,我们编写了健康索赔管理软件,养老金管理软件,401(k)软件和一些其他财务类型的东西。

现在,我们进入了一个新领域:衍生工具和定量分析类型的工作,这似乎非常令人兴奋。有人告诉我,在接下来的8到12个月中,这种情况将会下降。

现在,我已经学会了一些函数式编程,主要是通过这本书对各种语言的肤浅了解,但从未真正深入过它。现在,由于我们是.NET商店,所以我认为F#可能是一个不错的选择,因为我们可以潜在地利用某些.NET库和现有知识。

我的问题是,从哪里开始?我现在很难确定我是否应该使用Haskell,Erlang,Scala,F#等。它们似乎都很有趣且有能力,坦率地说,这可能是摆脱依赖Microsoft的好机会。

有人遇到过类似情况吗?如果是这样,那么您在过渡到功能方面的经验是什么?您选择了什么?为什么?我知道这是一个很大的问题,但是我不知道任何正在使用函数方法的开发人员,因此除了不断地谷歌搜索并在最佳函数式语言上到处发现火焰之战之外,我别无选择。


推荐读物:从哪里开始
gna 2014年

Answers:



10

您真正需要真实回答的第一个问题是,为什么要考虑使用功能语言。如果您不能为切换的业务原因辩解,那么您就不应该这样做。换句话说,仅仅因为您想学习它,或者因为似乎下一个“很酷”的事情而想在您的工作环境中引入一种新的框架,语言或其他新技术绝对是错误的。因此,您需要首先真实地问自己动机是什么。

如果您真的觉得需要一种功能语言来解决特定问题,并且假设大多数主流功能语言都可以满足您的要求,那么我会选择最成熟的语言和拥有最大用户群的语言。Erlang是一个不错的选择,可以满足这两个要求,但是,在纯ms / .NET环境中,我可以理解使用F#。


2
@ennukiller-我绝对可以看到函数式编程对于我们来说是个不错的选择,而且我不会说谎-我也很乐意将其用于提供纯粹的智力刺激。我们将要进行大量的计算,我想利用多核。同样,必须证明每个数学函数都是正确的,我知道使用函数可能会更容易。
Nodey The Node Guy 2011年

2
如果需要证明,函数式编程是最佳选择。这里的一些建议是命令式语言的功能附加组件-它们可能更熟悉,但是不会为您提供正确的代码。在存在副作用的情况下,您不能使用x = x(“参照透明性”)这一事实,并且必须证明代码后面的x仍然具有与前面相同的值。例如,在某些语言中,可能会x:=3; y:=10; x:=add(x,x);导致xa并非6且a y并非10。在这种情况下证明函数正确是不切实际的。
AndrewC 2012年

9

对于拥有现有.Net代码库的商店,我非常同意F#,就像对于拥有现有Java代码库的商店,我完全同意Scala。

函数式编程是任何其他工具。如果使用得当,并与您已经在开发代码的方式集成在一起,则可以通过更轻松地推断代码的工作方式来提高工作效率。但是,切换语言远非免费,因此,最好的选择是使您尽可能多地使用现有代码的解决方案。毕竟,要避免在您的环境中引入新语言,最可靠的方法是告诉您的同事,他们必须重写到目前为止所获得的一切,以便看到更改的好处,在这一点上,您仍在尝试出售它们。


7

我建议不进行功能编程学习新语言的。如果您想同时学习一种新语言的语法,那么如果您想学习一种新的范例,那就更加困难了。

当然,专门为执行功能性编程而开发的语言将具有一些优势(例如具有特定的构造,例如理解力和默认情况下使数据结构不可变),但总的来说,最大的步骤是将您的思维转变为功能性样式。C#非常适合这样做。

基本上,您只是停止更改代码状态。我已经使用Java完成此操作,而使用C#则更容易,因为您有lambda。一旦掌握了这种风格并对其有好处,就可以很容易地选择一种功能语言(无论您选择的是F#还是Erlang),并可以极大地提高生产力。


1
+1:我同意你的看法。我还开始以Java和C ++的更具功能性的风格进行编码(使用更多的final和const变量,使用函数组合分解复杂的操作,等等)。我认为这肯定改善了我在Java和C ++中的编程风格。过了一会儿,当您准备好进一步学习时,可以尝试一种功能语言(Haskell,Ocaml,SML,Lisp,Scala,F#等)
Giorgio

1

如果您只想学习和理解函数式编程,则只需安装IronPython并专注于Python中的函数功能。最糟糕的情况是,您将学习可以与C#集成的工具,以减少应用程序中的代码行数,并帮助您提前交付更多无错误的产品。

查看DaBeaz关于生成器的演示,以Python中的函数方法如何简化复杂事物为例 http://www.dabeaz.com/generators/

除此之外,我认为您最好花一些时间在Scala上。它以Beta模式在.NET上运行,因此您可以安装它并在今天用于学习目的,到秋天,它将成为.NET的发布模式。这意味着您可以在Scala中编写可跨JVM和.NET移植的代码。而且,由于Scala基于Actor和消息传递,因此非常容易构建由运行在不同计算机上的多个独立程序组成的应用程序。当您将.NET / JVM可移植性添加到组合中时,则需要考虑另一个方面。您可以拥有一个同时利用第三方Java库和第三方.NET库的应用程序,而无需弄乱正在开发的协议以使其相互通信。这两个过程都将用Scala编写,并将使用Scala远程消息传递(远程参与者)进行通信。从Typesafe.com的表现来看,看看Akka库似乎最终将成为Scala标准库的一部分。


+1:提及Scala及其在不同平台上的可用性。问题:akka是否会取代Scala中当前的actor实现?还是两者并存?
乔治

不确定Akka是否会在短期内取代目前的Scala演员,但是Scala的创建者Martin Odersky与Akka的创建者Jonas Boner一起加入了Typesafe公司。他们正在通过Akka和Play框架大力推广Scala。因此,发展重点可能会放在Akka。如果您只是通过Scala学习演员,那么最好首先关注Akka。
迈克尔·狄龙

非常感谢您提供的信息!我看了Scala中的演员,但到目前为止只是一个非常肤浅的演员。
乔治

-1

我当然同意接受的答案的主旨,并且考虑到您基本上是通过尝试Erlang来投入大量精力,这听起来像您可能对自己的学习方式有了很好的了解,并且只需要在右边稍加推动即可。方向,所以显然这对您来说是一个很好的答案。但是,我想我对问题的处理会有所不同,因为我看到这个答案对我没有多大帮助;我总是编码学习!所以,这是我的想法...

(顺便说一句,我倾向于去详细更多,说不适应,章节一本书,我敢肯定,我不能扼杀我的直觉完全在这里,但我要去尝试了不同的策略,我只是在这里总结我的想法,以防万一有人想在任何事情上提供更多细节,或者认为我说的东西以这种格式误导了我,我会尽力记住要通过响应提醒...)

为了让自己专注于工作,这里是我对OP中提出的主要问题的理解;我会尽量减少旁观者来解释...。

首先是快速解答:

我也有类似情况吗?至少是相似的。我一直处于领导地位,从事许多与之相关的各种项目……(CRM / Web / DB / Data Integration / etc。)

我如何/为什么要跳入功能?”我看到了一些LINQ示例,尽管我确实梦见过某种集成的静态类型的查询语言(因为我最初使用静态类型的语言(主要是C ++,后来使用C#) )]在我的整个职业生涯中……但是,我当时处在一个相当快速的环境中,尽管我经常设法查看过去发生的事情,但我从未真正想到过,所以我从未预见到它可以/将同样允许对Plain Old Objects的操作(大声笑!);当我看到它时,我知道我必须拥有它……因此,这就是原因以及操作方法的开始:我专注于学习理解LINQ 。

四个想法...错了,不,那不对...预见

当我阅读Martijn Verburg的答案时,提到业务功能使我立即着手开始为我正在从事的工作实现代码...根据最初试验的深度,我可能会做出不同的回答,但假设只是将您的大脚趾伸进去,我不确定我是否有直接工作的东西(或即将上班的东西)会给我带来兴奋/激情,我认为您可能应该对刚开始要解决的前几个问题感到兴奋...

我几乎完全以静态类型的语言为基础+ OOP隐喻和模式+多年来我在解决我的实际问题时最终无意中缠住了脑袋……重点是,如果您像我一样,您可能有很多大脑致力于处理LINQ / FP并不会帮助您太多的事情。

我认为它有点像纯粹的程序设计与OO编程:您将在OOP中最终使用很多程序,但是那些从C转向C ++却没有将grok / ken /“ get” OO 作为优先事项的人最终在C ++方面非常糟糕。我实际上采访了很多(超过15个)长期的固件和设备驱动程序开发人员,他们确实认为他们知道C ++,但是最多,他们对C ++的基础知识/教科书知识极为了解,而实际上对C ++并不了解具有OOP经验-因为他们从未真正进行过OOP ...他们编写了单例多用途类,这些类具有静态成员和静态函数,并带有一定数量的用作结构的非静态/非单例类。

FP也有一些类似的思路弯曲(对于那些未在范式上提出的人)和随之而来的其他事物,并且(尽管我发现许多技术的混合对我来说是理想的)我确实了解得更多,并且随着时间的流逝,在将真正的功能投入到我的工具集中之前,我的思维到底有多有限;过去,我设法以比大多数OO程序员更有创造力的方式来实现许多事情,但是当我使用这些概念之前,我的思维就变得很unt弱...可以解决所有问题在过去的几行代码中,在C ++ / C#中常常需要做很多曲解。

突然你发现自己...

在“太长”的帖子中

你们都在一个曲折的“没看过”的迷宫中,都一样。

您会在不久的将来看到电话会议,并且正在迅速到来。
>简洁
嗯。当然。好的,我们将说“简洁”模式为“开”。

您会在不久的将来看到电话会议,并且正在迅速到来。
>那是什么意思?
只是在说'。你今天早上不必做点什么吗?

您会在不久的将来看到电话会议,并且正在迅速到来。 
>嘿,你身后有仇人吗?
什么!?哪里?![大喊大叫]

>抱歉,我不知道在什么地方改写?
[持续跑步和尖叫,嘲讽未被注意到]

那么...亲爱的PSE,我应该学习什么?

我个人是从LINQ的C#开始的。它使我能够一次介绍一些概念,而当我不断阅读有关FP及其概念以及更多LINQ以及两者之间的关系时,它为我提供了前进的途径,同时仍可以进行富有成效的工作。我一次添加了几件事,数据查询很快就成为我的有用工具,而无需了解很多内容。

现在,回头来看,我希望我能够先完成下一个项目(大约一年后解决);我对F#非常熟悉(顺便说一句,这使我在学习ML(元语言)和其他派生语言(例如OCaml )方面有了很好的开端。

基本上,我认为对“什么”的正确答案取决于找到一些您感兴趣的编程问题的很好的配对,但是当然,它必须与您想学习的一些FP配对...(您可以冲洗/在将某些事项从清单中剔除之后再重复/起泡沫……)当然,您总会学到比您打算要做的主要事情更多的东西。起初我采取了一些小步骤,但是后来我做了更大的事情,然后在我做这些的时候让较小的东西放到位。

首先,什么使您的船浮起?尤其是刚开始时,最好对您有一些有趣和令人兴奋的事情,这将使您保持足够的兴趣,使之有价值。因此,要处理的IOW问题和解决这些问题的技术首先是LINQ和内联数据查询。递归对我来说是另一种递归,包括尾递归,我挖掘了它的GodelEscherBach-ness。而且我一直在阅读有关尾递归的信息。大约在这段时间里,我正在处理的事情被搁置了,结果我花了很多时间,所以我能够坚持很长时间。用更少的干扰就更容易了,但是因为我选择了我认为很有趣的东西,所以即使中断工作也并不困难。:)

尽管我没有提出任何很棒的建议,但我可以告诉您有关自我认知的Crab Program的信息,但我还是做到了。

还有...我要从中学到什么,亲爱的PSE,亲爱的PSE,还有什么?

为此,我使用了我刚好对各种算法都感兴趣的各种算法,再加上各种我想知道是否可以在F#中使用的算法,当我用尽了所有想法时,我会处理诸如99瓶啤酒Euler项目问题 ...

我相信您会找到许多与FP相关的有趣事物;它提供了从增强功能到OOP的所有内容,可以帮助您更加简洁地陈述事物,并将您之前考虑的方式转变为您无法识别甚至可能甚至没有思维模型表达的形状之前。

但是...我的模型上有一个洞,亲爱的PSE有一个洞...

这就是为什么重要的一点,尤其是在一开始的时候,但是确实要在整个学习过程中学习(并且在学习某些东西时不总是如此吗?),您至少要花一些时间在问题之间来阅读不相关但又很重要的东西。 FP和时间仍然可以阅读专家编写的源代码,最好解决相同或相似的问题;以及他们对事物的解释...

而且一直以来,您都必须动脑筋才能理解所有内容,而不是从旧的角度来看,而是从FP本身内部...在我看来,它点击了,...我能最好地将其关联变得越来越流利的荷兰语;在某些时候,我设法将自己的思想定为足够的思想(我通过沉浸来做到这一点,这基本上就是我在这里所描述的;沉浸于FP中,而不是尝试仅通过“学习书本”来学习它...

而且,最终我做到了;我设法将所有内容都内部化,并绞尽脑汁,直到开始弹出FP / LINQ时,我什至无需费力将其转换回OOP。(是的,我做到了;我必须要把裙子挂在上面。帽子。随便什么。)

最后的想法...

我的,我的,看来您正在失去思考聪明的能力
章节标题。多可惜。

电话会议仍在迅速进行中。现在看起来更大了。
>是的,是的,很好..简洁。我确实看到您设法失去了这种痛苦。
 亲密的电话,那...好吧,是的,我在……。
AAAAAAAHHHHHH !! [再次大喊大叫]

电话会议仍在迅速进行中。
它在某种程度上类似于兰西·约翰·克利兹维兹爵士。
它几乎在你身上。
>嘿,快点回来!我有一个实验可以和您一起尝试!(和Po-ta-to)

您自然可以在网上找到有关FP的大量信息。主要的事情是理解基本概念,然后学习应用它们。例如,了解不变性,以及为什么它对FP重要/有用。我强烈建议您学习一些理论,将其与所有内容一起使用,例如纯FP如何更适合形式证明。这是F#的祖先ML的推动力。当然,YMMV可能会让您无聊得要哭,在这种情况下,需要大量示例,需要反复试验才能弄清楚为什么所使用的技术才是真正的原因,可以帮助您获得“啊哈!” 灯泡时刻。

因此,我暂时将其保留。希望这对某人有用。我想更多地学习一些具体的东西,但暂时没有时间。我希望能找到一些时间尽快恢复原状,尽管对我来说这将是漫长的一周,所以至少可能是周末。

<3“引入GRUEBOL是一个权宜之计;直到SnozzML完成为止。应该很快;我这次有一个庞大的委员会来帮助我。” -格蕾丝·霍珀威特·埃格海德(Grace Hopperwit Egghead),著名的遗言,XX97 GUE <3


什么是“亲爱的SO”?
gnat 2014年

亲爱的堆栈溢出;应该与歌曲“桶中有一个洞”的节奏相匹配xD
shelleybutterfly 2014年

当发布在SO之外时,这似乎会使您的观点更难以理解-考虑修改以解决这一问题
gnat 2014年

rp!是的,确实做到了。tyvm。:)
shelleybutterfly 2014年

如果有人对如何改善我的答案有任何建议,我将不胜感激。还是不好的建议?它实际上是基于我的经验,因此如果可以使它更有用,我很乐意对其进行更改。谢谢;)
shelleybutterfly 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.