среда, 31 декабря 2014 г.

Об отступах в коде Haskell

Отступы - они бывают разными. Два hs-файла могут совершенно одинаково визуально выглядеть в текстовом редакторе, однако один из них при этом компилироваться не будет.

Как известно, отступы в коде могут выполняться как пробелами, так и табуляторами. Обратите внимание на следующие два скрина, снятых с Notepad++:




Второй вариант отличается от первого только тем, что между ключевым словом let и образцом sideArea вместо пробела стоит табулятор. Однако визуально выравнивание [форматирование] выглядит совершенно идентично:


Этот код был переписан мною из книги М. Липовачи. Понятное дело, что на бумаге не разобрать, где пробелы, а где табуляторы. Изначально я написал вариант, показанный мною на первом скрине. Визуально это в точности соответствовало тому, как обозначенный код выглядел в книге. Однако попытка загрузить этот код в ghci завершилась неудачей:

λ: :l src
[1 of 1] Compiling Main             ( src.hs, interpreted )

src.hs:4:25: parse error on input `='
Failed, modules loaded: none.
λ:

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

λ: :l src
[1 of 1] Compiling Main             ( src.hs, interpreted )
Ok, modules loaded: Main.
λ: cylinder 10.0 20.0
1884.9555921538758
λ:

Если в настройках текстового редактора включить опцию автоматической замены табуляторов на соответствующее количество пробелов:


то такой файл так же будет успешно загружен.

Нельзя сказать, что какой-то из  трёх обозначенных выше вариантов не отформатирован - они все отформатированы. Однако в Haskell, как видим, форматирование форматированию рознь, даже если визуально никакой разницы не видно. Вот такая может быть "музыка"...

Вывод
Хорошо это или плохо? На мой взгляд, такая разборчивость к пробелам и табуляторам не слишком удобна, хотя и не смертельна... Т.о. чтобы гарантированно не наступать на обозначенные грабли, при написании кода на Haskell, лучше всегда заранее активировать опцию автоматической замены табуляторов некоторым количеством пробелов.

1 комментарий:

Unknown комментирует...

Точно такая же ситуация и для скриптов на Python ... Приходится использовать или пробелы или TAB.