Haskell中的并行性

アレッ*_*ックス 5 parallel-processing haskell

我正在尝试创建一个执行并行评估的简单示例:

import Control.Parallel.Strategies

main = do
  runEval $ do
    a <- rpar (\x -> x + 5)
    b <- rseq (\x -> x + 15)
    return (a, b)
Run Code Online (Sandbox Code Playgroud)

它说

Couldn't match expected type `IO t0'
                with actual type `(Integer -> Integer, Integer -> Integer)'
Run Code Online (Sandbox Code Playgroud)

我知道,它与Haskell中的并行性无关,但是,我如何在Haskell中构建这样一个简单的例子?

Rod*_*ada 2

问题在于您使用 lambda 的方式。rpar和 的类型rseq是,a -> Eval a但您传递的 lambda 显然具有类型Integer -> Integer,因为您没有将参数传递给 lambda。

像这样的编译(另请注意,您需要打印结果):

main = do
    print $ runEval $ do
        a <- rpar $ (\x -> x + 5) 4
        b <- rseq $ (\x -> x + 15) 4
        return (a, b)
Run Code Online (Sandbox Code Playgroud)

了解有关 Haskell 中并行处理的更多信息。Simon Marlow写了一本很棒的书,名为“Haskell 中的并行和并发编程” ,HTML 版本可在此处免费获得:

  • @Alex 表达式 `do { a &lt;- rpar $ (+5) 4; b &lt;- rseq $ (+15) 4; 返回(a,b);由于“runEval”和“do”之间的“$”,因此 }` 作为单个参数传递。如果没有那个“$”,编译器会将其视为“do {print $ runEval do;” ... }`,单词“do”实际上是“runEval”的唯一参数。如果您定义了一个与内部 do 块等效的单独函数: `f = do { a &lt;- rpar $ (+5) 4; b &lt;- rseq $ (+15) 4; 返回(a,b);}`,那么 `main` 可以简单地是 `print $ runEval f`。 (2认同)