I started reading Parallel and Concurrent Programming in Haskell by Simon Marlow, which has example code in parconc-examples. At the moment, it will only build with ghc 8.2.2, but it was easy enough to point stack at an older LTS version that used 8.2.2.

parconc-examples is not set up like a Stack project, because individual source code files each have their own main function. This causes stack ghci to complain about the ambiguity:

The main module to load is ambiguous. Candidates are:
1.  Package `parconc-examples' component parconc-examples:exe:GenSamples with main-is file: /Users/shaun/workspace/parconc-examples-0.4.7/kmeans/GenSamples.hs
.. [~ 80 more examples here]

However, stack exec ghci works just fine.

Now the problem is getting dante-mode and haskell-mode to use stack exec ghci instead of the default stack ghci.

A .dir-local file at the root of the parconc-examples directory seemed like the right thing to do to keep the setup from messing with other parts of the setup. This looks like:

((haskell-mode . ((haskell-process-path-stack . ("stack" "exec"))
                  (haskell-process-args-stack-ghci . ("--" "-ferror-spans"))
                  (dante-repl-command-line . ("stack" "exec" "ghci")))))

The documentation says that this is a list mapping major modes to variables. dante is a minor mode, so the dante-repl-command-line variable goes under the list of haskell-mode variables.