17

我的意思是:当您免费设计应用程序副作用等时,F# 代码会自动分布在所有内核上吗?

4

8 回答 8

15

不,恐怕不会。鉴于 F# 不是一种纯粹的函数式语言(在最严格的意义上),我相信这样做会相当困难。在 F# 中充分利用并行性的主要方法是使用异步工作流(我相信主要是通过异步模块)。.NET 4.0 引入的 TPL(任务并行库)将在 F# 中发挥类似的作用(尽管值得注意的是,它同样可以用于所有 .NET 语言),但我不能说我'我确切地知道它将如何与现有的异步框架集成。也许微软会简单地建议对所有事情都使用 TPL,或者他们可能会将两者都作为一种选择,最终将成为事实上的标准......

无论如何,这里有几篇关于 F# 中的异步编程/工作流的文章可以帮助您入门。

于 2009-03-25T18:03:55.977 回答
8

F# 不会让它自动化,它只是让它变得简单。

又一个机会链接到Luca 的 PDC 演讲。从 52:20 开始的八分钟是 F# 异步工作流的精彩演示。它摇摆不定!

于 2009-03-25T20:16:48.140 回答
3

不,我很确定它不会自动为您并行化。它必须知道你的代码没有副作用,这很难证明,一方面。

当然,F# 可以更轻松地并行化您的代码,尤其是在您没有任何副作用的情况下……但那是另一回事。

于 2009-03-25T17:53:01.417 回答
2

与提到的其他人一样,F# 不会自动跨内核扩展,并且仍然需要一个框架,例如 Josh 提到的 ParallelFX 端口。

F# 通常与并行处理的潜力相关联,因为它默认对象是不可变的,因此在许多情况下无需锁定。

于 2009-03-25T18:00:22.740 回答
2

关于纯度注释:代码契约有一个 Pure 属性。我记得听说 BCL 的某些部分已经使用了这个。潜在地,这个属性也可以被并行化框架使用,但我目前还不知道有这样的工作。另外,我什至不确定代码联系人在 F# 中的使用效果如何,所以这里有很多未知数。

不过,看看所有这些东西是如何结合在一起的,将会很有趣。

于 2009-03-26T10:42:45.593 回答
1

不,它不会。您仍然必须通过 F# 支持的众多机制之一显式编组对其他线程的调用。

于 2009-03-25T17:52:29.670 回答
1

我的理解是它不会,但并行扩展正在被修改以使其可以被 F# 使用。这不会让它自动多线程它,应该让它很容易实现。

于 2009-03-25T17:53:17.687 回答
1

好吧,你有你的答案,但我只是想补充一点,我认为这是 F# 最重要的限制,因为它是一种混合命令式/函数式语言。

我希望看到 F# 的一些扩展,它声明一个函数是pure。也就是说,它没有函数类型未表示的副作用。这个想法是,一个函数只有在它引用其他“已知纯”函数时才是纯函数。当然,这只有在可以要求作为函数参数传递的委托引用纯函数时才有用。

于 2009-03-25T18:13:01.323 回答