I believe the problem is that you're calling as' `pseq`
. This evaluates as'
to WHNF, which means that it only determines whether the list is empty or not. But you want the lists to be fully evaluated:
import Control.Parallel.Strategies
forceList :: [a] -> [a]
forceList = withStrategy (evalList rseq)
-- or use rdeepseq to force the evaluation of everything
knuthBendixOptimized rs = forceList as'
`par` forceList bs'
`pseq` as' ++ bs'
where
(as, bs) = splitAt 3000 rs
as' = knuthBendix as
bs' = knuthBendix bs
Note that Haskell's usual term for this is parallelism. And concurrency is used for explicit work in IO
with threads and their communication. See the GHC manual.