|
|
1
68
如果你刚刚发现函数式编程,我 不要 建议尝试就这个主题发表权威性的讲话。我知道在我学习F#的前6个月里,我所有的代码都是C#,语法有点笨拙。然而,在这段时间之后,我能够以惯用的、功能性的风格编写出始终如一的好代码。 我建议您也这样做:等待6个月左右,直到函数式编程风格变得更加自然,然后进行演示。
我向我所在地区的.NET用户组做了一次F#演示,我所在组的许多人对F#的模式匹配印象深刻。具体来说,我演示了如何在C和F中遍历抽象语法树:
上面的代码是用惯用的C#风格编写的。它使用访问者模式而不是类型测试来保证类型安全。这大约是218 LOC。
这里是65 LOC。因为它使用模式匹配而不是访问者模式,所以我们不会丢失任何类型安全性,代码也很容易阅读。 任何 这种符号处理比C更容易用F来写。 形状
要用C语言简洁地编写这段代码是不可能的。 |
|
|
2
14
我的建议是在代码库中选择一些常见的问题点和一些核心点,并以函数式的方式重写它们。如果你能证明一个更好的解决方案,它将大大有助于赢得同事的支持。 |
|
|
3
9
Practical Functional C# (我不太愿意在这里链接到我自己的东西,但我认为这与本案有关)。如果您有一个通用的“企业”应用程序,那么显示(比如)模式匹配中表达式的可爱程度不会太有说服力。 但在现实世界的应用程序中,有大量的模式在低编码级别上弹出。使用高阶函数,可以使它们消失。正如我在这组博客文章中所展示的,我最喜欢的例子是WCF的“try close/finally abort”模式。“try/finally dispose”模式非常常见,以至于它变成了一个语言关键字:using。“锁”也是一样。这两个函数都被简单地表示为高阶函数,只有因为C#最初不支持它们,我们才需要硬编码的语言关键字来支持它们。(快速:切换“锁”块以使用ReaderWriter锁。哎呀,我们必须先编写一个高阶函数。) 但也许说服力只需要看看微软。泛型又称参数多态性?这几乎不是OO,而是一个很好的功能概念,现在,每个人都喜欢它。没有它,可爱的Ninject框架就无法工作。兰博达斯?作为表达树,它们是LINQ、Fluent NHibernate等获得所有能力的方式。同样,这不是来自OO或命令式编程。新线程库?没有闭包就很难看。 因此,在过去的十年中,函数式编程一直是.NET之类的东西的福音。主要的进步(如泛型,“LINQ”)直接来自函数式语言。为什么不意识到其中的某些东西并更多地参与其中呢?这就是我对怀疑论者所说的话。 更大的问题 实际上是让人们对高阶函数的理解有了飞跃。虽然这很容易,但如果你一生中从未见过它,它可能会令人震惊,令人费解。(见鬼,似乎很多人认为泛型只是用于类型安全集合,而LINQ只是嵌入式SQL。) 所以,您应该做的是浏览您的代码库,并找到那些过于复杂的地方。搜索底层模式,并使用函数将其很好地串在一起。如果你找不到,你可以满足于只演示列表。例如“查找此列表中的所有foo并将其删除”。这是功能样式“myList.Remove(x=>x.Bla>0)”中的1行内容,而C#样式中的7行内容(创建临时列表、循环和添加以删除项目、循环并删除项目)。
祝你好运 |
|
|
4
3
约翰·休斯(John Hughes)的一篇名为 Why Functional Programming Matters . 我建议你自己做一些例子,直到你能令人信服地提出论文中的论点为止。 论文中的许多例子都是数字的,不能与今天的读者产生共鸣。我给学生们做的另一个当代练习是利用那篇论文中的思想将大型媒体文件打包到4.7GB DVD上进行备份。他们使用Michael Mitzenmacher的“气泡搜索”算法生成替代包装,使用该算法和Hughes的技术,很容易获得99.9%的DVD(最后一张除外)。很甜。 |
|
|
5
2
|
|
|
6
1
另一个例子是 Quicksort algorithm
但是需要更多的迭代语言编码。在被引用的网站上,你还可以找到许多其他语言之间比较的例子。 |
|
|
7
1
为了实现您的目标,并与组织中的其他人沟通,您需要以更好的方式展示您公司的业务。 如果函数式编程对您的业务领域毫无用处,那么使用两种算法来演示函数式编程的威力是没有用的。因此,使用一些现有代码并在功能上重写它。如果你能证明这是更好的,人们会听你的——你已经向他们展示了一个具体的、相关的例子。如果不能,那么函数式编程可能不是您一直在寻找的解决方案。 |
|
|
8
1
例如,在python中,您可以重新实现Haskell qsort crackmigg,如下所示:
虽然最后一行写的是
可以说是更“蟒蛇式的”。 但这显然比这里的实现更简洁: http://hetland.org/coding/python/quicksort.html
功能版本非常清晰
如果
和
|
|
9
0
一个很好的例子是使用现有的编程语言创建您自己的编程语言,您必须使用它 Monads .
看看这篇文章: Functional .NET - LINQ or Language Integrated Monads? |
|
|
10
0
涉及回溯搜索和简化GUI中撤销支持的算法是我在实践中使用函数式的两个地方。 |
|
|
12
0
向他们展示jQuery在DOM元素上的迭代方式:
函数式编程在上述日常工作中非常有用!
|
|
|
13
0
我最近想出了一个小把戏,让传递到扩展方法中的lambdas看起来更像F#ish。 下面是: 我想做的是:
现在,可轻松实现的扩展方法:
这很好,但现在我有动力让我的调用代码看起来类似
(我从来都不喜欢lambda表达式开头的“()”),因此:
这让我可以这样称呼它:
虽然没有太大的改变,但我仍然很享受,可以如此轻松地进行小调整,同时去除“()”噪音,使其更具可读性。 |
|
|
14
0
不是真的回答这个问题,但是对于那些想了解C函数式编程的人来说,这是一个非常好的链接# http://blogs.msdn.com/b/ericwhite/archive/2006/10/04/fp-tutorial.aspx |
|
|
15
-1
|
|
|
16
-3
有趣的是,没有人真正回答了这个问题:什么任务最好以“功能性风格”完成? 程序/算法由两部分组成:逻辑控制和数据结构。我认为功能性风格中最好的任务是那些涉及列表或数组的任务,它们的行为类似于列表(例如qsort)。函数式编程语言对列表有很好的支持,这并非巧合。 当数据结构偏离列表时,我认为使用函数式编程风格有点“不自然”。 |