Можно ли сохранить промежуточный образ в контейнер и использовать его для других проектов?
для минимизации образа с приложением
multistage-build

этап 1
устанавливаете все необходимые инструменты и зависимости для компиляции приложения
выполняете компиляцию приложения

этап 2
устанавливаете все зависимости необходимые для работы приложения
копируете готовое приложение в новый образ
Во-первых stack имеет родной способ сборки через докер: https://docs.haskellstack.org/en/stable/docker_int...

Если хочется собирать докер-образы с некоторыми пред-собранными зависимостями, можно взять образ используемый в stack, сбилдить там зависимости проекта и уже результат использовать для сборки в докере.

Если нужно собирать приложение в докере, а потом деплоить только бинарь, то это уже multistage.
Ну такой вот примерно рецепт усредненный, потому что вариаций масса:

FROM fpco/stack-build:lts-16.20 as build

WORKDIR /opt/source
RUN stack --resolver=lts-16.20 --system-ghc install example-exe

FROM fpco/stack-run
WORKDIR /opt/dist
COPY --from=build-env /home/user/.local/bin/example-exe .

CMD ./example-exe