2012-06-29 2 views
2

Откуда я могу получить полный набор правил отступов для написания кода Haskell?Полный набор правил отступов в haskell

Прошлые вопросы, которые похожи на мой следующий вопрос, заставили меня задать вопрос выше. В чем причина сообщения об ошибке: parse error on input 'something'?

Сообщение об ошибке я получил:

baby.hs: 103: 2: ошибка разбора на входе `MyList '(ошибка в этой строке)

код Я пытаюсь скомпилировать:

myList = ["aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", "Zebra"] 
quicksort :: (Ord a) => [a] -> [a] 
quicksort [] = [] 
quicksort (x:xs) = 
let smallerSorted = quicksort [a | a <- xs, a <= x] 
biggerSorted = quicksort [a | a <- xs, a > x] 
in smallerSorted ++ [x] ++ biggerSorted 

Редактируйте Optimight:

Я сдвинут код в вопросе к новому. hs файл и попытался скомпилировать его. Осталось похожее сообщение об ошибке. Подробности ниже:

Error
quickSort.hs: 5: 62: не разобрать ошибки на входе `=» Ошибка, модули загружены: нет. (0,02 сек, 0 байт)

Код :: быстрая сортировка (Ord а) => [а] -> [а]
быстрой сортировки [] = [] быстрой сортировки (х: хз) = пусть smallerSorted = quicksort [a | a < - xs, a < = x]
largeSorted = quicksort [a | a < - xs, a> x]
in smallSorted ++ [x] ++ moreSorted
myList = ["самолет", "самолет", "самолет", "вертолет", "ВЕРТОЛЕТ", "Зебра", " «Америка»]

+3

Отчет языка, в частности, http://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-210002.7 и http://www.haskell.org/onlinereport/haskell2010/haskellch10 .html # x17-17800010.3 –

+0

Является ли строка 103 списком, определяющим 'myList'? Каковы предшествующие ему линии? – dave4420

+0

@ dave4420 Сэр, я изучаю «Learn-you-a-haskell» и сохраняю все свои образцы кода в одном файле, то есть baby.hs. Предыдущие строки включают эти образцы кода. – Optimight

ответ

10

по крайней мере, для стандартного Haskell (без расширений языка), правила размещения объясняются in Section 10.3 of the Haskell 2010 report.

отчет может быть немного формальным на свой вкус. В различных учебниках и учебниках по Haskell есть несколько неофициальных объяснений правил компоновки, например Haskell Wikibook.

В вашем конкретном случае сообщение об ошибке указывает на строку 103, но вы вставляете только пару строк. Я вижу, что по крайней мере отступ в конструкции let-in нарушен. Вы должны написать что-то вроде следующего:

xs = ["aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", "Zebra"] 
quicksort :: (Ord a) => [a] -> [a] 
quicksort [] = [] 
quicksort (x:xs) = let smallerSorted = quicksort [a | a <- xs, a <= x] 
         biggerSorted = quicksort [a | a <- xs, a > x] 
        in smallerSorted ++ [x] ++ biggerSorted 
+0

Ошибка по-прежнему сохраняется. Я взял объявление xs в последнюю строку, затем ошибка (ошибка синтаксического анализа на входе '= ') сдвинулась в строку: largeSorted = quicksort [a | a <- xs, a > x] – Optimight

+0

@Optimight, отступом код работает для меня. Вы используете пробелы, а не вкладки для отступов, не так ли? – Heatsink

+0

@Heatsink Я использую gedit для написания кода. И да, я использую вкладку, но устанавливаю для вставки пробелов. – Optimight

2

Если я понял правильно вас самый простой способ избежать этой проблемы заключается в письменной форме одного do и let вроде этого:

fName = do 
    expression1 = ... 
    exp2 ... 

fName param = let 
    exp1 = ... 
    exp2 = ... 
    exp3 = ... 
    in ...  -- can be indented more if you want 

Главное здесь то, что первым абзацем в exp1 легко обнаружить и сохранить в каждой новой строке.




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

Вкладки или пробелы указывают БЛОК, например {com1; com2} в C++

Правила офсайд. В начале исходного файла, первый верхний уровень Объявление может быть начато в любом столбце. Каждое последующее объявление верхнего уровня должно иметь одинаковый отступ!

LET IN, WHERE помнит отпечаток следующего токена, который он видит. Если пустая строка или отступ справа далее, она продолжит предыдущую строку. Если такой же отступ, это начало нового элемента в том же блоке.

win tab 4 spc, unix tab 8 spaces Используйте пробелы вместо табуляции !!!

line1... 
    continue line 1 -- as long it doesn't start at same indent as line1 
    3spaces would indicate block with line 1! 
    line4 same block 
    same indent is same line1 block 
    all indents for BLOCK must be same. 

line8... -- is new block and end of line1 block 
    positon of first column in block is start 

line 1 
cont line1 
    cont line 1 
    cont line 1 
    block1 -- would be cont line 1 
    block1 -- if not for this block1 at same indent 


Bad way: 
do 
    action0 
    if condition 
    then action1 
    else action2 
    action3 

Good way: 
do 
    action0 
    if condition 
    then action1 
    else action2 
    action3 
Смежные вопросы