如何在现实世界中使用函数式编程?[关闭]


103

函数式语言之所以不错,是因为它们可以通过消除状态来避免错误,而且还可以为您轻松地自动并行化它们,而不必担心线程数。

但是,作为Win32开发人员,我可以对应用程序的某些dll使用Haskell吗?如果我愿意,有没有真正的优势会自动带给我?如果是这样,那么给我带来这个好处的是编译器?

F#是否会并行化您跨多个内核编写的函数,并自动为您自动执行cpu?您会看到任务管理器中的线程数增加吗?

基本上,我的问题是,我如何才能以一种实用的方式开始使用Haskell,如果这样做我会真的看到一些好处吗?


2
就个人而言,我会研究erlang-就是我。
詹森·邦廷

2
为了澄清一点,我已经有几种不同的函数式编程语言的经验,并且我知道它们是如何工作的以及它们之间的区别。但是这个问题是具体的:我如何将其用于实际用途。
Brian R. Bondy

Answers:



25

F#不包含任何将功能传递给不同CPU或机器的魔术粉尘。F#/ Haskell和其他功能编程语言的作用是使您更容易编写可以独立于创建线程或CPU进行处理的函数。

我觉得在这里链接到我参与的播客的链接不正确,似乎有些偏离,但是在《牧群密码》中,我们与Matt Podwysocki进行了交谈,我们提出了同样的问题,他给出了一些有趣的答案。该情节中也有许多与函数式编程相关的良好链接。我找到了一个链接标题“ 功能编程为何如此重要 ”,它可能为您提供一些答案。


21
然后,我为您发布:herdingcode.com/?p=45 :)
Brian R. Bondy


14

这可能也很有趣:“ 现实世界中的函数式编程

例子在F#和C#中,但是该理论是相当通用的。从我阅读(预发行版)的内容来看,它绝对很有趣,但是到目前为止,我认为这使我希望越来越多地使用C#,并使用Parallel Extensions之类的库。


您是否仍然觉得自己“想越来越多地使用C#”?F#提供了一些有趣的功能。我最大的收获就是减少了打字(这意味着在用代码表达解决方案的过程中减少了摩擦)。
丹尼尔(Daniel)

1
@Daniel在某些方面甚至更是如此; p但是,我使用的工具可能是非典型的。
Marc Gravell

8

您没有提到,但我假设您正在使用C ++。实现功能的一种可能的简单方法是通过C ++ / CLI到F#。C ++包含“魔术像素尘”(称为IJW:It Just Works),使您可以调用和调用托管代码。这样,调用F#代码几乎和从C#中一样简单。

我已经在一个完全用C / C ++编写的程序(FreeSWITCH)中使用了它。使用单个托管的C ++ / CLI(使用/ clr开关),它可以神奇地转换为托管代码,然后从那里可以加载F#插件并执行它们。为了使部署变得更加容易,F#可以静态链接其所有依赖项,因此您无需部署F#运行时文件。使CLR代码具有吸引力的另一件事是,您可以将托管代码(代理)传递给C代码,并且运行时会自动为您带来麻烦。

如果您决定采用Haskell方式,则将要查找的功能是FFI:外部功能接口。但是,我认为它不会为您提供与带有F#的C ++ / CLI相同级别的集成。


6

我目前正在自己​​学习Haskell,当您开始学习Haskell时,它似乎并不很吸引人,因为学习经历并不像学习C#这样的语言,这是一个全新的世界,但是我注意到我可以写的非常复杂只需几行代码中的表达式,当我回顾该代码时,它更加简洁,紧凑而紧凑。我绝对喜欢它!实际上,您可以编写比大多数其他语言都更小,更易于维护和更复杂的真实程序,我投票赞成您学习它!

祝好运。


4

由于您提到Win32和DLL,因此我假设您正在使用非托管代码。在这种情况下,GHC将非常适合您。去年下半年,我在Windows下使用FFI编写了一个DDE服务器,以便与MS DDE库进行对话,而且令人惊讶的是,这是一种非常令人愉快的体验(尤其是考虑到我是Unix方面的人)。Haskell的FFI功能强大(甚至支持例如从C或其他库到Haskell函数的回调),并且在编写C级代码时进行Haskell的类型检查就像是梦想成真。

最后一点是Haskell的主要优点之一:类型系统很棒。就是说,就像任何强大的工具一样。它需要时间和精力来充分利用它。

因此,是的,可以开始在Haskell中编写链接到其余代码的少量代码(尽管您可能会发现,更容易从链接到其他代码的小型Haskell程序开始),这是值得花费的有相当多的时间来学习并尽可能使用它。您可能最终会像我一样,在Haskell中计划一个与Windows代码(在我的情况下为复杂的Excel加载项)紧密集成的相当重要的项目。

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.