【问题标题】:Parallelism in HaskellHaskell 中的并行性
【发布时间】:2013-10-25 06:28:31
【问题描述】:

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

import Control.Parallel.Strategies

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

上面写着

Couldn't match expected type `IO t0'
                with actual type `(Integer -> Integer, Integer -> Integer)'

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

【问题讨论】:

    标签: haskell parallel-processing


    【解决方案1】:

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

    这样的东西可以编译(还要注意你需要打印结果):

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

    了解有关 Haskell 中并行处理的更多信息。 Simon Marlow 有一本书叫"Parallel and Concurrent Programming in Haskell",HTML 版本免费提供here

    【讨论】:

    • 对了,为什么runEval $ do必须使用"$"?
    • @Alex $ 被称为应用运算符,本质上是为了摆脱括号而存在。 f $ xf (x) 相同,g $ f $ xg (f (x)) 相同。它右侧的所有内容都被包裹在括号中并传递给左侧的所有内容。
    • @Alex 如果你是 Haskell 的新手,我建议你阅读“Learn you a Haskell for Great Good!”,它也可以在线获取:learnyouahaskell.com/chapters
    • @bheklilr,我知道这一点。我在问,为什么我必须在 runEval $ do 中特别使用它?
    • @Alex 表达式do { a &lt;- rpar $ (+5) 4; b &lt;- rseq $ (+15) 4; return (a, b); } 作为单个参数传递,这要归功于runEvaldo 之间的$。如果没有$,编译器会将其视为do {print $ runEval do; ... },而do 一词实际上是runEval 的唯一参数。如果您定义了一个与内部 do 块等效的单独函数:f = do { a &lt;- rpar $ (+5) 4; b &lt;- rseq $ (+15) 4; return (a, b); },则 main 可以简单地为 print $ runEval f
    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2011-07-17
    • 2013-02-06
    相关资源
    最近更新 更多