Почему я не должен смешивать вкладки и пробелы?

Я часто читал, что мне не следует смешивать вкладки и пробелы в Haskell, или что я не должен использовать вкладки вообще. Почему?

Ответы

Ответ 1

Проблема двоякая. Прежде всего, Haskell чувствителен к отступу, например, следующий код недействителен:

example = (a, b)
  where
    a = "Hello"
     b = "World"

Обе привязки должны быть отступом с одинаковым количеством пробелов/вкладок (см. Правило вне игры). Хотя это очевидно в этом случае, оно скорее скрыто в следующем, где я обозначаю пробел через · и вкладку: ":

example = (a, b)
··where
····a = "Hello"
»   b = "World"

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

example = (a, b)
··where
····a = "Hello"
»       b = "World"

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

example = (a, b)
»       where»  a = "Hello"
»       »       b = "World"

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

example = (a, b)
»   where»  a = "Hello"
»   »   b = "World"

Тем не менее, это все еще правильно. Тем не менее, кто-то, кто использовал пробелы, может переписывать b 'связывание с пробелами и заканчивать ошибкой парсера.

Если соблюдение конвенции код на протяжении всего кода, который гарантирует, что вы используете только вкладки в начале строки и использовать символ новой строки после where, let и do вы можете избежать некоторых проблем (см 11). Тем не менее, текущие выпуски GHC предупреждают о закладках по умолчанию, потому что они уже были источником из многих ошибок синтаксического анализа в прошлом, так что вы, вероятно, хотите, чтобы избавиться от них тоже.

Смотрите также