2015-10-13 3 views
2

Я следующий код, предназначенный принять двухтактный из m и заменить двухтактный, который начинается с s с оценкой выражения eHaskell: ошибка синтаксического анализа на входе '|'

exec (Assign s e) m = assign s (eval e m) m 
where assign _ _ [] = error ("undef var " ++ s) 
    assign s v (x:xs) 
     | fst x == s = if sameKind v (fst x) 
         then (fst x,v):xs 
         else error "type error in assign" 
     | otherwise = x:(assign s v xs) 
      where sameKind (VInt a) (VInt b) = True 
       sameKind (VBool a) (VBool b) = True 
       sameKind _ _ = False 

При компиляции, я получаю ошибку: parse error on input '|'

Кто-нибудь знает, как это исправить?

+2

Вы, кажется, отступы. Используйте пробелы, и у него больше шансов на работу. (Если вы хотите использовать вкладки, вам нужно разделить вещи на большее количество строк. Вкладки также плохие для выравнивания.) – Ryan

+0

заменил вкладки пробелами, теперь имеет ошибку синтаксического анализа на входе «назначить» на третьей строке. поэтому я предполагаю, что это будет новый вопрос. –

+2

Все ваши 'назначенные' должны совпадать друг с другом, как и 'sameKind'. – melpomene

ответ

5

Согласно Haskell 98 report: (?)

Tab stops are 8 characters apart.

Ваш код, кажется, рассчитан на 5 космических вкладок; измените настройки вкладки вашего редактора или прекратите использование вкладок, и проблема исчезнет.

Причина заключается в том: Haskell думает, что вы отступом это так:

where assign _ _ [] = error ("undef var " ++ s) 
     assign s v (x:xs) 

, который, как вы можете видеть, означает начало второго определения еще внутри РИТ первого определения.

также:

Не делайте этого:

where f [] = one_expr 
     f (x:xn) = another_expr 

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

Смежные вопросы