Here's what finally fixed it. My cabal config was something like this:
library exposed-modules: My.Module1 , My.Module3 executable my-executable main-is: Main.hs build-depends: base >=4.6 && <4.7 , chorez
Main.hs for the executable imports
My.Module3 imports the private
exposed-modules fixed the issue. I figured this out because I realized that all the symbols that couldn't be found came from that module.
cabal repl worked just fine (I tested the modules by hand and they all basically worked), but
cabal run didn't. I feel like I should be able to use a library with private modules in an executable, but in this case I just forgot to add the new module to the list, and I have no reason to make any module private, so I'm up and running for now.