函数式编程的论点


10

我最近一直在有趣地学习F#(我是VB.NET/C#开发人员),我真的很喜欢它提供的一些功能。从理论上讲是这样。但是我想不出要选择使用F#而不是C#进行编码的方案。有任何想法吗?


2
F#不能完全代表函数式编程。试试吧Clojure
Job

1
我不认识F#,但是每当我想振作起来时,我都会使用Haskell。到目前为止,每次都工作过;)

1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey是关于该主题的出色视频(OO与功能)
mikera

动态功能语言?您可以根据需要拥有任意数量。:P
Erik Reppen

Answers:



6

我在考虑要选择使用F#而不是C#进行编码的方案时遇到了麻烦。有任何想法吗?

这里

异步服务器

  • 异步IO的异步工作流。
  • 线程安全消息传递的邮箱处理器。
  • 服务器状态和消息目录的联合类型。
  • 状态机的模式匹配和尾部递归。

元编程(例如解析)

  • 解析器生成器,例如fslex和fsyacc。
  • 解析器组合器,例如FParsec。
  • 优雅的手动解析器的活动模式。
  • 表示解析树的代数数据类型。
  • 模式匹配以操纵树,例如应用优化阶段。
  • 在运行时生成快速代码的反思。

技术计算

  • 高阶函数可实现优雅而快速的算法代码。
  • 用于符号操作的代数数据类型和模式匹配。
  • 大量.NET库的互操作性。
  • 使用F#交互进行交互。
  • 用于按摩数据的计算表达式。
  • 改进正确性的度量单位。

GUI应用

  • 建模为在用户界面代码和应用程​​序逻辑代码之间传递的异步消息。
  • 高阶函数使您可以声明性地定义用户界面。

逻辑程序设计

  • 持久性集合,易于回溯。
  • 尾巴要求可靠性。
  • 自动归纳,易于通用编程。

测试中

  • 交互式运行单元测试。
  • BDD意味着编写口译员。
  • 良好的脚本语言,用于编写测试工具并可视化结果。

性能

  • inline 用于免费的高阶抽象。
  • 快速状态机的尾叫。
  • 纯功能的数据结构,可降低延迟。
  • 元编程用于生成优化的代码。

我承认我不了解F#或C#,但我建议您花几天时间在F#上,看看您的想法。我认为使用REPL是支持它的任何语言的一项重大胜利
Zachary K

5

以下是每天或多或少使用功能样式编程的目的。

我们使用相当大的数据集进行大量统计和精算工作。从数据库中获取的数据本质上是静态的,不可变的对象。没有理由使用方法创建类。

计算的每个阶段都会添加一些其他详细信息,但本质上不会使对象发生变化。在管道的“末端”,我们实际上是在做花哨的减少来计算总和,计数等。

想象一下。

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

计算的每个“阶段”都是一个功能性的编程循环,该循环执行简单的读取-计算-产率,并创建包含其他内容和结果的复合对象。

(我们使用Python,因此使用生成器函数进行功能编程。)

使用无状态,不可变的对象会更容易。


Python是否具有与此F#等效的功能?criteria() |> some_query |> calculate |> enrich |> summarize我发现前向管道运算符可以导致更清晰的代码,但我离题了。
2011年

@ChaosPandion:首先,这种语法使我感到困惑。但是有些人似乎喜欢它。有无数的Python包。我相信您可以在SO上搜索并找到答案。
S.Lott

@混沌:不是我所知道的。通常我会作曲map以获得相同的效果。
保罗·内森

4

从技术上讲,它不是函数式编程的唯一属性,并且F#不是纯函数式语言。作为ML后代之一,F#提供了出色的模式匹配和代数数据类型。因此,对于任何需要复杂数据结构的任务,F#都比C#更具表现力且易于使用。

想象一下用C#和F#实现编译器-如果您的语言提供ADT和模式匹配,则表示一个抽象语法树并对其进行转换要简单得多。


2

映射减少大量海量多系统和海量多核并行性的理想选择。考虑到当今的入门级服务器配备48个内核(超线程96个),这非常酷。


2

如果您想尝试全部功能,请尝试Haskell,Erlang也有一些很酷的东西。

西蒙·佩顿·琼斯(Simon Payton-Jones)谈到Haskell时,他希望拥有一个显然没有错误的程序,而不是没有明显的错误的程序。

(我可能引述了一些报价,但您知道了)

通过限制副作用,您可以更轻松地证明代码正确。


1

一个明显的优势是它更容易并行化。


2
您在谈论纯净,一个明显的缺点是纯净会使程序变慢很多。因此,并行+纯不一定是一件好事。
乔恩·哈罗普
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.