Переключающий компонент для GHC-мод

У меня есть проект, основным компонентом которого является библиотека

library
  hs-source-dirs:      src
  ...

и который также определяет

executable todo
   if !flag(example)
        Buildable: False
   ghc-options: -Wall
   cpp-options: -DGHCJS_BROWSER

   default-language: Haskell2010
   hs-source-dirs: example/todo
   other-modules: TodoDispatcher
                  TodoStore
                  TodoComponents


   main-is: Main.hs

Теперь, если я пытаюсь набрать команду check one file, я получаю следующую ошибку

Configuring react-flux-1.0.3...
EXCEPTION: types:
           Could not find module ‘TodoDispatcher’
           Use -v to see a list of the files searched for.

И если я делаю это из командной строки, я получаю

 $ ghc-mod  --ghcOpt=-v7 type example/todo/TodoViews.hs 29 28                                            not sandboxed
EXCEPTION: types:
           Could not find module ‘TodoDispatcher’
           Locations searched:
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/TodoDispatcher.hs
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/TodoDispatcher.lhs
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/TodoDispatcher.hsig
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/TodoDispatcher.lhsig
             src/TodoDispatcher.hs
             src/TodoDispatcher.lhs
             src/TodoDispatcher.hsig
             src/TodoDispatcher.lhsig
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/autogen/TodoDispatcher.hs
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/autogen/TodoDispatcher.lhs
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/autogen/TodoDispatcher.hsig
             .stack-work/dist/x86_64-osx/Cabal-1.22.8.0/build/autogen/TodoDispatcher.lhsig

Так что, кажется, игнорировать hs-source-dirs настройка компонента, к которому относится текущий файл, к которому я пытаюсь проверить тип, и вместо этого рассмотрим файл из первого компонента пакета, так же, как это делает по умолчанию cabal repl

By default cabal repl loads the first component in a package.

Как я могу изменить этот приятный кусочек глобального состояния?

1 ответ

Решение

Итак, вот что вы должны сделать, чтобы заставить это работать:

  • Вам нужно отредактировать файл cabal и изменить флаг компонента на

    `Buildable : True`
    
  • Затем вы можете проверить тип

     $ ghc-mod --ghcOpt=-v7 type example/todo/TodoViews.hs 29 28                                            not sandboxed
     29 24 29 34 "[Char]"
     27 25 33 12 "TextInputArgs"
     27 9 33 12 "ReactElementM [
    

В Emacs:

  • Возможно, вам нужно выйти из Emacs

  • Вам нужно открыть свой файл и haskell-process-load-file (он же Cc Cl, он же Space m s b)

Он должен был загрузить правильную "цель", то есть на языке haskell для "компонента" в cabal. Если это работает, то ghc-mod также должен. (?)

http://haskell.github.io/haskell-mode/manual/latest/Interactive-Haskell.html

14.8.1 Изменение цели REPL

С помощью haskell-session-change-target вы можете изменить цель для сеанса REPL.

После запуска сеанса REPL в буфере haskell-interactive-mode вызовите цель haskell-session-change-target и выберите одну из доступных целей для

  • тестирование
  • эталонный тест
  • исполнимый
  • Библиотека

Ответьте "да", чтобы перезапустить сеанс и запустить свои тесты, тесты, исполняемые файлы.

Другие вопросы по тегам