如何在现实世界中使用函数式编程?
函数式语言之所以不错,是因为它们可以通过消除状态来避免错误,而且还可以为我们轻松地自动并行化它们,而不必担心线程数。
但是作为Win32开发人员,我可以对应用程序的某些dll使用Haskell吗?如果我这样做了,那么我会自动获得真正的好处吗?如果是这样,那么给我带来这个好处的是编译器?
我们是否在多个核上编写了Fparallelize函数,并且为我们自动为CPU编写了Fparallelize函数?我们是否会看到任务管理器中的线程数增加?
基本上,我的问题是,我如何才能以一种实用的方式开始使用Haskell,如果这样做我会真的看到一些好处吗?
解决方案
我目前正在自己学习Haskell,当我们开始学习Haskell时,它似乎并不很吸引人,因为学习经历并不像学习C#这样的语言,这是一个全新的世界,但是我注意到我可以写非常非常复杂的东西只需几行代码中的表达式,当我回顾该代码时,它更加简洁,紧凑而紧凑。我绝对喜欢它!实际上,我们可以编写比大多数其他语言都更小,更易于维护和更复杂的现实程序,我投票赞成我们学习它!
祝你好运。
F不包含任何魔术粉尘,这些尘土会将功能传递给不同的CPU或者计算机。 F#/ Haskell和其他功能编程语言的作用是使我们更容易编写可以独立于创建线程或者CPU进行处理的函数。
我觉得在这里链接到我参与的播客的链接不正确,似乎有些偏离,但是在《牧群密码》一集中,我们与Matt Podwysocki进行了交谈,我们提出了同样的问题,他给出了一些有趣的答案。在该情节中,还有很多与函数式编程有关的良好链接。我找到了一个链接标题" Why Functional Programming Matters",它可能为我们提供一些答案。
我们所寻找的似乎是Real World Haskell这本书。我们可以在线免费阅读:
http://book.realworldhaskell.org/
这也可能很有趣:
"真实世界的函数式编程"
例子在Fand C#中,但是该理论是相当通用的。
从我阅读(预发行版)的内容来看,它绝对很有趣,但是到目前为止,我认为这使我希望越来越多地使用C#,并使用Parallel Extensions之类的库。
我们没有提到,但我假设我们正在使用C ++。实现功能的一种可能的简单方法是通过C ++ / CLI到F#。 C ++包含"魔术像素尘"(称为IJW:It Just Works),使我们可以调用和调用托管代码。这样,调用Fcode几乎就像从C#中一样简单。
我已经在一个完全用C / C ++编写的程序(FreeSWITCH)中使用了它。使用单个托管的C ++ / CLI(使用/ clr开关),它可以神奇地转换为托管代码,然后从那里可以加载Fplugins并执行它们。为了使部署变得更加容易,Fcan静态链接了其所有依赖项,因此我们无需部署Fruntime文件。使CLR代码具有吸引力的另一件事是,我们可以将托管代码(代理)传递给C代码,并且运行时会自动为我们带来麻烦。
如果我们决定采用Haskell方式,则将要查找的功能是FFI:外部功能接口。但是,我认为它不会为我们提供与带有F#的C ++ / CLI相同级别的集成。
由于我们提到Win32和DLL,因此我假设我们正在使用非托管代码。在这种情况下,GHC将为我们很好地工作。去年下半年,我在Windows下使用FFI编写了一个DDE服务器,以便与MS DDE库进行对话,而且令人惊讶的是,这是一次非常愉快的体验(特别是考虑到我是Unix方面的人)。 Haskell的FFI功能强大(甚至支持例如从C或者其他库到Haskell函数的回调),并且在编写C级代码时进行Haskell的类型检查就像是梦想成真。
最后一点是Haskell的主要优点之一:类型系统很棒。就是说,就像任何强大的工具一样。它需要时间和精力来充分利用它。
因此,是的,可以开始在Haskell中编写少量代码,这些代码链接到其余代码中(尽管我们可能发现更容易从链接到其他代码的小型Haskell程序开始),这是值得花费的有相当多的时间来学习并在任何可能的地方使用它。我们可能最终会像我一样,在Haskell中计划一个与Windows代码(在我的情况下,是一个复杂的Excel加载项)紧密集成的相当重要的项目。