私は、葉に一連の値を格納する簡単なツリーと、テストを容易にするためのいくつかの単純な関数を持っています。Haskellでこのツリーを並行してどのように減らすことができますか?
私は無制限の数のプロセッサを持ち、ツリーのバランスが取れているならば、対数的に任意のバイナリ結合演算(+、*、min、lcm)を使って木を減らすことができます。
TreeをFoldableのインスタンスにすることで、組み込み関数を使用してツリーを左から右または右から左に順番に減らすことができますが、これは線形時間を要します。
ハスケルを使ってこのようなツリーを並行して減らすにはどうすればよいですか?
parCata fLeaf fNode = go where
go (Leaf z) = fLeaf z
go (Node l r) = gol `par` gor `pseq` fNode gol gor where
gol = go l
gor = go r
しかし、たとえcata
の観点で書くことができます
cata fLeaf fNode = go where
go (Leaf z) = fLeaf z
go (Node l r) = fNode (go l) (go r)
私はパラレル1はかなり単純に適応されるだろうとします
{-# LANGUAGE DeriveFoldable #-}
data Tree a = Leaf a | Node (Tree a) (Tree a)
deriving (Show, Foldable)
toList :: Tree a -> [a]
toList = foldr (:) []
range :: Int -> Int -> Tree Int
range x y
| x < y = Node (range x y') (range x' y)
| otherwise = Leaf x
where
y' = quot (x + y) 2
x' = y' + 1
'Foldable'の実装をパラレルにカスタマイズすることはできませんか? – Xodarap
[複数のプロセッサを持つバイナリツリートラバーサルを高速化する] Haskell(パラレル)の可能な複製(http:// stackoverflow。com/questions/27091624/speeding-up-binary-tree-traversal-with-multiple-processors-haskell-parallel) – jberryman
@ Xodarapどうすればよいですか? –