代码之家  ›  专栏  ›  技术社区  ›  LarsH

如何在Haskell制定战略控制。平行。策略?

  •  11
  • LarsH  · 技术社区  · 14 年前

    更新 :我刚找到 this documentation page . 希望有一个链接 the documentation that I'd been using

    更新2 :此文档使我对如何使用控制策略模块。但是我还没有完全解决这个问题。。。见问题的结尾。

    我一直想用 parListChunk

    下面是我的非并行函数:

    possibKs n r = [ (k, (hanoiRCountK n k r)) | k <- [1 .. n-1] ]
    

    我想把它并行化,就像这个天真的尝试:

    possibKs n r 
        | n < parCutoff  = results
        | otherwise      = parListChunk parChunkSize results
        where results = [ (k, (hanoiRCountK n k r)) | k <- [1 .. n-1] ]
    

    但这种结构不适合parListChunk。 医生说:

    parListChunk :: Int -> Strategy a -> Strategy [a]
    

    parListChunk按顺序应用 并列的清单。有助于增加 粒度

    很好,这就是我想要的。但是怎么用呢?我还没找到这样的例子。如果我理解类型声明,parListChunk是一个 Int Strategy<a> (借用C++参数化类型标记来帮助检查我是否真正理解了这一点),并返回一个 Strategy<[a]> . 在我的情况下,我正在处理 内景 对于 a 所以parListChunk需要一个 Strategy<Int> . 那么什么是 Strategy 我该怎么做呢?一旦我成功地使用了parListChunk,我该如何处理 战略

    这个 Strategy type is defined 这样地:

    type Strategy a = a -> Done
    

    全部的 战略文件。) 所以 策略<内部> 是一个函数,它接受Int类型的参数并返回Done。显然,它会导致它的论点在某个特定的时间或某物上被评估。我在哪里买的,我应该用哪种?

    sPar :: a -> Strategy b
    sSeq :: a -> Strategy b
    r0 :: Strategy a
    rwhnf :: Strategy a
    

    但它们都不允许您确定类型参数--它们生成 Strategy<b> ,否则无法提供参数 ! 怎么回事??除此之外,我不知道这些是什么意思。

    我确实找到了一个类似函数的例子 parList being used 因此:

    return . maximum $ map optimize xs `using` parList
    

    它用这个时髦的 using 函数,声明为:

    using :: a -> Strategy a -> a
    

    很公平。。。就我而言,我可能想要 [Int] ,因此需要一个int列表和 Strategy<[Int]> 你做了什么?将策略应用于列表?和)返回整数列表。所以我试着以parList为例,改变了我的想法 otherwise 守卫到:

    | otherwise      = results `using` parListChunk parChunkSize
    

    Couldn't match expected type `[(Int, Integer)]'
           against inferred type `a -> Eval a'
    Probable cause: `parListChunk' is applied to too few arguments
    In the second argument of `using', namely
        `parListChunk parChunkSize'
    In the expression: results `using` parListChunk parChunkSize
    

    有人能告诉我这个房间用什么吗 Strategy a Strategy [a]

    看着 Basic Strategies ,我想我需要使用 rseq 战略。可能。所以我试着

    | otherwise      = results `using` (parListChunk parChunkSize rseq)
    

    These API docs Control.Parallel.Strategies .

    有什么线索吗?顺便说一句,我经常收到关于加载包的消息:

    Loading package deepseq-1.1.0.0 ... linking ... done.
    Loading package parallel-2.2.0.1 ... linking ... done.
    

    API docs Edward

    1 回复  |  直到 7 年前
        1
  •  2
  •   LarsH    14 年前

    好的,我把密码搞定了。我通过使用 rwhnf rseq :

    | otherwise      = results `using` (parListChunk parChunkSize rwhnf)
    

    this source code , rwhnf公司 已重命名为 在版本3中。所以我猜我的并行软件包版本已经过时了 this documentation

    我想这是使用“实验性”软件包的部分代价。