如何在现实世界中运用函数式编程?

103

函数式语言之所以好,是因为它们通过消除状态来避免错误,同时也因为它们可以轻松地自动并行化,无需担心线程数量。

作为一个Win32开发人员,我能否在我的应用程序的某些DLL文件中使用Haskell? 如果我这样做,是否有真正的优势会自动带给我?如果有,是什么给了我这个优势?编译器吗?

F#是否会自动将您编写的函数并行化到多个核心和CPU上?您会在任务管理器中看到线程计数增加吗?

我如何开始实用地使用Haskell,如果我这样做,我会真正看到一些好处吗?


2
就我个人而言,我会研究一下 Erlang - 但这只是我的看法。 - Jason Bunting
2
稍微澄清一下,我已经有几种不同的函数式编程语言的经验,我知道它们是如何工作的以及它们之间的区别。但这个问题是具体指:我如何将它应用到实际场景中。 - Brian R. Bondy
1
可能是重复的问题:为什么要使用函数式编程语言? - Roger Pate
6个回答

41

1
我正在等待它的印刷版本。看起来它会是目前为止最好的书之一。我敢打赌,它将比《实用Ocaml》更好地为对Haskell感兴趣的人服务。 - Friedrich

25

F#没有包含任何神奇的魔尘,可以将函数传递到不同的CPU或机器上。F#/Haskell和其他函数式编程语言使您能够编写可以独立于创建它们的线程或CPU进行处理的函数。

我不觉得在这里发布我参与的播客链接很合适。这似乎有点离谱,但在我们与Matt Podwysocki交谈的Herding Code一集中,我们问了同样的问题,他给出了一些有趣的答案。该集还有很多关于函数式编程的好链接。我发现一个名为“为什么函数式编程很重要”的链接。那可能会为你提供一些答案。


21
好的,我会为您翻译这段内容:那么我会为您发布这篇文章:http://herdingcode.com/?p=45 :) - Brian R. Bondy
https://dev59.com/6HRB5IYBdhLWcg3wQFHu - Paul Nathan

15

这也许也是有趣的:《实用函数式编程》

例子使用 F# 和 C#,但理论相当通用。 根据我所读过(预发布版),它绝对是有趣的,但到目前为止我认为它让我更想坚持使用像 Parallel Extensions 这样的 C# 库。


你是否仍然觉得自己“想要越来越多地粘着C#”? F#提供了一些有趣的功能。我得到的最大推动力是更少的打字(这意味着在代码中表达解决方案的过程中摩擦更小)。 - Daniel
1
@Daniel 在某些方面,甚至更加如此 ;p 不过我所使用的工具可能有些不寻常。 - Marc Gravell

8
你没有提到,但我假设你使用的是C++。一个可能比较简单的进入函数式编程的方式是通过C++/CLI到F#。C++包含“魔法粉尘”(称为IJW:它只是起作用),允许你调用和退出托管代码。有了这个,从C++调用F#代码几乎和从C#一样简单。
我在一个程序(FreeSWITCH)中使用过这个方法,该程序完全由C/C++编写。通过一个单独的托管C++/CLI(使用/clr开关),它就神奇地转换成托管代码,然后我可以加载我的F#插件并执行它们。为了更容易进行部署,F#可以静态链接所有依赖项,因此您不需要部署F#运行时文件。使CLR代码更具吸引力的另一件事是,您可以将托管代码(委托)传递给C代码,运行时会自动为您创建一个thunk。
如果你决定选择Haskell,你要找的功能是FFI:外部函数接口。然而,我认为它不会像C++/CLI与F#那样给你同样级别的集成。

6
我目前正在学习Haskell。当你开始学习它时,它似乎并不是很有趣,因为学习体验与学习C#等语言的学习体验完全不同。
这是一个全新的世界,但我注意到我可以用只有几行代码的非常复杂的表达式。当我回顾代码时,它更为简洁;它又小又紧凑。
我非常喜欢它!你确实可以编写比大多数其他语言允许的更小、更易于维护和更复杂的真实世界程序。我推荐你学习它!!

4

由于您提到了Win32和DLL,我猜想您正在处理非托管代码。在这种情况下,GHC非常适合您。去年底,我使用FFI编写了一个DDE服务器,在Windows下与Microsoft DDE库通信,令人惊讶的是,这是一次非常愉快的经历(尤其是考虑到我是Unix用户)。

Haskell的FFI功能强大(甚至支持从C或其他库回调到Haskell函数),在编写C级别代码时拥有Haskell的类型检查就像梦想成真一样。

最后一点是Haskell的主要优势之一:类型系统非常出色。话虽如此,它就像任何强大的工具一样,需要时间和精力来充分利用它。

是的,用Haskell编写一些小代码片段并将其链接到您的其他代码中是可能的(尽管您可能会发现从编写链接到您的其他代码的小型Haskell程序开始更容易),并且值得花费相当多的时间学习和在任何地方使用它。您可能最终像我一样,在Haskell中规划一个与Windows代码紧密集成的相当大的项目(在我的情况下,是一个复杂的Excel插件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接