2016-05-12 3 views
-2

Я реализую арифметические примеры дерева выражений из программирования книги в Haskell по Хаттону, и я получаю ошибку синтаксиса:Haskell вдавливания в сделай блок

parse error (possibly incorrect indentation or mismatched brackets)

firstgrm = do t <- secgrm 
      (do { symbol "##"; 
       o <- firstgrm; 
      return (O (t ## o));} 
     +++ return t)       -- parse error here 
+2

Ваш синтаксис повсюду. Я даже не могу понять, что вы пытаетесь сделать. – dfeuer

+1

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

+1

и что это за '(+++)' оператор? Вы можете убедить меня, что с правильным интервалом и определением для этого '(+++)', что это должно работать, но это, конечно, не идиоматично .... – jamshidh

ответ

9

Где фигурные скобки опущен, Haskell использует off-side rule; блоки выражаются их отступом. Wikibook имеет ладно описание того, как работает Haskell отступы:

All grouped expressions must be exactly aligned. On the first line, Haskell counts everything to the left of the expression as indent, even though it is not whitespace.

В вашем примере, у вас есть два do блоков. Внутренний использует фигурные скобки, а внешний - нет. Вы можете получить код для компиляции путем добавления фигурных скобок к наружному блоку do:

firstgrm = do { t <- secgrm; 
      (do { symbol "##"; 
       o <- firstgrm; 
      return (O (t ## o));} 
     +++ return t) } 

... хотя я действительно не рекомендую.

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

firstgrm = do t <- secgrm 
       x t +++ return t 
    where 
    x t = do symbol "##" 
      o <- firstgrm 
      return (O (t ## o)) 
Смежные вопросы