I&#39;ve used Control.Parallel and Control.Parallel.Strategies extensively in the past, and I thought I knew what I was doing.&nbsp; I declared the following function:<br><br>findSupernodes&#39; :: S.Set Name -&gt; Int -&gt; Tree -&gt; Protein.Tree -&gt; S.Set Name<br>
findSupernodes&#39; set size (Node i _ _ s il ir) (Protein.Node _ pl pr _ g) <br>&nbsp;&nbsp;&nbsp; | S.size g &gt; size = (Name (fromIntegral i)) `S.insert` set<br>&nbsp;&nbsp;&nbsp; | otherwise&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp; leftNodes `S.union` rightNodes<br>&nbsp;&nbsp;&nbsp; where leftNodes =&nbsp; (findSupernodes&#39; set size il pl)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rightNodes = (findSupernodes&#39; set size il pl)&nbsp;&nbsp; <br>findSupernodes&#39; set size (Leaf _ _) (Protein.Gene _ _ _) = set <br><br>and then simply wrote the following as an initial stab at parallelizing it, because actually calling this function causes the program to execute an absurd number of string comparisons:<br>
<br>findSupernodes = findSupernodes&#39; S.empty<br>findSupernodes&#39; :: S.Set Name -&gt; Int -&gt; Tree -&gt; Protein.Tree -&gt; S.Set Name<br>findSupernodes&#39; set size (Node i _ _ s il ir) (Protein.Node _ pl pr _ g) <br>
&nbsp;&nbsp;&nbsp; | S.size g &gt; size = (Name (fromIntegral i)) `S.insert` set<br>&nbsp;&nbsp;&nbsp; | otherwise&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp; leftNodes `par` rightNodes `seq` leftNodes `S.union` rightNodes<br>&nbsp;&nbsp;&nbsp; where leftNodes =&nbsp; (findSupernodes&#39; set size il pl)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rightNodes = (findSupernodes&#39; set size il pl)&nbsp;&nbsp; <br>findSupernodes&#39; set size (Leaf _ _) (Protein.Gene _ _ _) = set <br><br>The thing is, these two functions don&#39;t return the same thing.&nbsp; The parallel version is returning an empty set, while the sequential version returns what it should return.&nbsp; Any clue what I did wrong?<br>
<br>-- Jeff<br>