Где фигурные скобки опущен, 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))
Ваш синтаксис повсюду. Я даже не могу понять, что вы пытаетесь сделать. – dfeuer
Наиболее явно неправильный синтаксис - это болванка с запятой, но все это выглядит странно. Мой мозг не очень хорошо работает с деталями правила макета Haskell, поэтому я склонен быть очень скучным в том, как я отступаю от своего кода. – dfeuer
и что это за '(+++)' оператор? Вы можете убедить меня, что с правильным интервалом и определением для этого '(+++)', что это должно работать, но это, конечно, не идиоматично .... – jamshidh