103

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

不过,作为 Win32 开发人员,我可以将 Haskell 用于我的应用程序的某些 dll 吗?如果我这样做了,是否会自动为我带来真正的优势?如果是这样,是什么给了我这个优势,编译器?

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

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

4

6 回答 6

41

看起来这本书 Real World Haskell 正是您正在寻找的。您可以在线免费阅读:

http://book.realworldhaskell.org/

于 2008-09-27T04:41:14.787 回答
25

F# 不包含任何可以将功能传递给不同 CPU 或机器的魔法小精灵。F#/Haskell 和其他函数式编程语言所做的是让您更容易编写可以独立于创建它们的线程或 CPU 进行处理的函数。

我觉得在这里发布我参与的播客的链接不正确,似乎有点不对劲,但在我们与 Matt Podwysocki 交谈的 Herding Code 插曲中,我们问了同样的问题,他给出了一些有趣的答案。在那一集中还有很多与函数式编程相关的好链接。我找到了一个标题为“为什么函数式编程很重要”的链接,这可能会为您提供一些答案。

于 2008-09-27T04:16:57.530 回答
14

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

示例在 F# 和 C# 中,但理论相当通用。从我读过的(预发布)来看,这绝对很有趣,但到目前为止,我认为这让我越来越想使用 C#,使用 Parallel Extensions 之类的库。

于 2008-09-29T07:10:28.750 回答
8

您没有提到,但我假设您使用的是 C++。进入函数式的一种可能简单的方法是通过 C++/CLI 到 F#。C++ 包含“神奇的精灵尘埃”(称为 IJW:It Just Works),允许您调用和调用托管代码。有了这个,调用 F# 代码几乎和从 C# 中一样简单。

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

如果您决定采用 Haskell 方式,那么您将寻找的功能是 FFI:Foreign Function Interface。但是,我认为它不会为您提供与 C++/CLI 与 F# 相同级别的集成。

于 2008-10-12T10:26:42.010 回答
6

我目前正在自己​​学习 Haskell,当你开始学习它时,它似乎并不吸引人,因为学习体验与学习 C# 之类的语言完全不同,这是一个全新的世界,但我注意到我可以编写非常非常复杂的代码几行代码的表达式,当我回顾代码时,它更加简洁,它又小又紧。我非常喜欢它!您确实可以编写比大多数其他语言允许的更小、更易于维护、更复杂的实际程序,我投票支持您学习它!

祝你好运。

于 2008-09-27T04:10:04.317 回答
4

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

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

所以,是的,可以开始在 Haskell 中编写少量代码,链接到您的其余代码(尽管您可能会发现从链接到其他代码的小型 Haskell 程序开始更容易),而且值得花费花费大量时间来学习并尽可能地使用它。你可能会像我一样,在 Haskell 中计划一个与 Windows 代码(在我的例子中是复杂的 Excel 插件)紧密集成的相当大的项目。

于 2009-05-18T00:09:47.793 回答