更新:我刚刚找到this documentation page。希望the documentation that I'd been using有一个链接,它似乎是最终的API文档。但也许这是一个新的,未发布的工作。
更新2 :本文档让我更好地了解了如何使用Control.Parallel.Strategies模块。但是我还没有完全解决问题......看到问题的结尾。
我一直在尝试在Haskell中使用parListChunk或其他一些并行控制功能。但我无法弄清楚如何使用它们。警告:我是Haskell noob。大约20年前,我学习了一些关于函数式编程的东西(!)。
这是我的非并行化功能:
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依次应用a 策略的块(子序列) 并行列表。有用增加 粒度
好,这就是我想要的。但是怎么用呢?我还没有找到任何这方面的例子。如果我理解类型声明,parListChunk是一个带Int
和Strategy<a>
的函数(借用C ++参数化类型表示法来帮助检查我是否真的理解这一点),并返回一个{ {1}}。在我的情况下,我正在为Strategy<[a]>
处理Int
,因此parListChunk需要一个a
参数和一个Int
。那么Strategy<Int>
是什么?我如何制作一个?一旦我成功使用了parListChunk,我该如何处理它吐出的Strategy
?
Strategy
(这是所有策略的文档。)
所以type Strategy a = a -> Done
是一个函数,它接受Int类型的参数并返回Done。显然它会导致其论证在某个时间或某个时间得到评估。我从哪里得到一个,我应该使用哪种?
以下功能似乎会返回策略:
Strategy<Int>
但是它们都不允许您确定类型参数 - 当您提供参数sPar :: a -> Strategy b
sSeq :: a -> Strategy b
r0 :: Strategy a
rwhnf :: Strategy a
时它们会生成Strategy<b>
,否则您无法提供参数a
!那是怎么回事??除此之外,我不知道这些意味着什么。
我确实在SO上找到了类似函数parList being used的一个示例:
a
它使用这个时髦的return . maximum $ map optimize xs `using` parList
函数,声明为:
using
足够公平......在我的情况下,我可能希望using :: a -> Strategy a -> a
为a
,因此它需要一个Ints列表和一个[Int]
并且(做了什么?将策略应用于列表?和)返回Ints列表。所以我尝试按照parList示例将Strategy<[Int]>
后卫更改为:
otherwise
但是我必须承认我还在黑暗中拍摄......我不能完全遵循周围的类型签名。所以上面给出错误并不太令人惊讶:
| otherwise = results `using` parListChunk parChunkSize
有人可以告诉我使用parListChunk的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
参数吗?以及如何使用parListChunk返回的Strategy a
?
新篇
关注Basic Strategies,我认为我需要使用Strategy [a]
策略。大概。所以我试试
rseq
但是GHC说rseq“不在范围内”。
These API docs说包中没有rseq,但sSeq似乎已经取代了它。好的,所以我使用了sSeq,但它也“不在范围内”。即使我正在导入| otherwise = results `using` (parListChunk parChunkSize rseq)
。
任何线索?顺便说一下,我以前收到有关加载包的消息:
Control.Parallel.Strategies
显然,它告诉我有哪个版本的并行软件包:2.2.0.1。但我没有在API docs中看到有关那里描述的版本的信息。如果我不使用rseq或sSeq,我应该使用什么?为什么Edward能够使用parList?
答案 0 :(得分:2)
好的,我的代码正常运行。我使用rwhnf
而不是rseq
来编译它:
| otherwise = results `using` (parListChunk parChunkSize rwhnf)
根据this source code,rwhnf
在版本3中被重命名为rseq
。所以我猜我的版本的Parallel包已经过时了this documentation。 :-S
我猜这是使用“实验性”套餐的价格的一部分。
无论如何,代码编译并运行。它是否对并行性做任何有用的事情是另一个问题......