Отладка на Haskell — проблемы с синтаксисом

#haskell #ghc #ghci

#haskell #ghc #ghci

Вопрос:

В настоящее время я изучаю Haskell (в последнее время слишком многие из моих вопросов начинаются с этого утверждения), и у меня возникают проблемы с компиляцией программ из-за синтаксических ошибок, главным образом при выявлении ошибок, понимании / разрешении сообщений об ошибках, предоставляемых GHC.

Например, мне потребовалось много времени, чтобы устранить ошибку в приведенном ниже коде. имейте в виду, что это было взято из учебника по Haskell:

 getNums = do
    putStrLn "enter a number (0 to terminate)"
    num <- getLine
    if read num == 0
    then return []
    else do rest <- getNums
    return ((read num :: Int):rest)
  

Сообщение об ошибке вывода GHCI тоже не помогло:

 Number.hs:18:17:
    The last statement in a 'do' block must be an expression
      rest <- getNums
  

В настоящее время я запускаю GHCI через терминал Linux и компилирую вручную, кодирование написано в gedit. Мой вопрос:

Существуют ли какие-либо лучшие среды или настройки, которые предоставят более подробное объяснение ошибок во время компиляции для такого новичка, как я?

Т.е. что-то похожее на то, как IDE NetBeans будет предоставлять подсказки / подсказки относительно того, почему код синтаксически некорректен?

Последнее, что я хочу сделать, это вставить блок кода в SO и быть идиотом, который говорит: «исправь это для меня»

Редактировать

Я понимаю, что это может быть не очень хорошим вопросом, потому что он в основном спрашивает мнения людей.

Комментарии:

1. Я лично использую Sublime Text 3 с плагином SublimeHaskell, но это может быть немного кривой обучения и имеет некоторые нетривиальные настройки, особенно для начинающих. Я бы рекомендовал поиграть в интегрированной среде разработки FpComplete, если вы не возражаете против использования интерактивной среды разработки. Если вы хотите, чтобы некоторые инструменты командной строки помогали вам кодировать, hlint stylish-haskell они великолепны и могут быть установлены через cabal. Лично, несмотря на то, что я использую SublimeHaskell, я предпочитаю компилировать и запускать свой код через терминал, поскольку у меня просто больше прямого контроля над потоком выполнения.

2. спасибо, я собираюсь взглянуть на плагин gedit haskell, а также попробую sublime. Определенно буду смотреть на hlint и stylish-haskell. Они звучат точно так же, как то, что я ищу.

Ответ №1:

Проблема связана с отступом вашего кода. Используйте пробелы для отступов. Отступ с 4 пробелами считается хорошей практикой. Этот код работает отлично:

 getNums = do
    putStrLn "enter a number (0 to terminate)"
    num <- getLine
    if read num == 0
    then return []
    else do rest <- getNums
            return ((read num :: Int):rest)  
  

Существуют ли какие-либо лучшие среды или настройки
, которые предоставят более подробное объяснение ошибок во время компиляции для такого
новичка, как я?

Я бы посоветовал вам отказаться от gedit использования некоторых правильных редакторов кода и использовать их. Если вы предпочитаете графический интерфейс, Eclipse, похоже, обеспечивает хорошую поддержку Haskell или Emacs / Vi для более продвинутого. Или, если вы хотите остаться gedit , установите для него соответствующий плагин Haskell (я слышал, что он хорошо поддерживает.)

Комментарии:

1. код на самом деле не компилируется в ghci, в нем указано, что rest выходит за рамки. Как я уже сказал в вопросе, я знал об ошибке и исправил ее. это было, как вы сказали, из-за отступов. Ввод rest <- getNums в новую строку прояснил ситуацию. Однако в сообщении об ошибке это не указано, что является моей ошибкой!!! Спасибо за советы по eclipse / emacs / Vi. я не большой поклонник eclipse (может быть предубеждением net beans), однако я обязательно попробую плагин gedit haskell. Приветствия!