Получение ошибки синтаксического анализа при вводе «‹-» в программе Yampa

Я застрял на кодировании основной научной фантастики для игры, похожей на Марио, которую я пишу для развлечения. Вот код, который не анализируется:

master_combine = proc pi -> do 
                            -- rec cgg <- player_update >>> (initial_game --> bounds_updater) >>> iPre initial_game -< (pi, cgg)
                            rec gs  <- player_update >>> (initial_game --> bounds_updater) -< (pi, dgs)
                                dgs <- iPre initial_game -< gs
                            returnA -< gs

И это код, который анализируется и выполняется нормально:

master_combine = proc pi -> do 
                            rec cgg <- player_update >>> (initial_game --> bounds_updater) >>> iPre initial_game -< (pi, cgg)
                            -- rec gs  <- player_update >>> (initial_game --> bounds_updater) -< (pi, dgs)
                            --  dgs <- iPre initial_game -< gs
                            returnA -< cgg

Обратите внимание, что я сохранил обе версии в одном блоке кода с комментариями, чтобы сделать разницу более заметной.

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

mainSF = parseInput >>> master_combine >>> draw

В первой версии я пытаюсь использовать промежуточные имена gs (состояние игры) и dgs (состояние отложенной игры). Об ошибке сообщается в строке, начинающейся с dgs.

Во втором варианте, который у меня работает, мне пришлось писать всю НФ одной строкой.

Я хотел бы использовать первую версию кода, потому что мне нужно расширить функциональность, подключив дополнительные SF, которые подразумевают петли отрицательной обратной связи.

Я продолжаю искать справку по rec в обозначении Arrow "do" и всегда нахожу одни и те же примеры, которые подчеркивают правильный отступ кода. Но я делаю отступ с помощью Sublime, и интервал выглядит хорошо для меня. Есть ли другой способ? Скобки, фигурные скобки? Что-либо?


person Razvan-Ionut Olteanu    schedule 01.04.2016    source источник
comment
rec gs <- .. и dgs <- .. должны начинаться в одном столбце. Это правило отступа — все в блоке начинается с одного и того же столбца. И первый синтаксический элемент блока определяет, каким должен быть уровень отступа. Кстати, да, вы можете использовать фигурные скобки, чтобы избежать проблем с отступами - do \n x \n y становится do { x ; y }.   -  person user2407038    schedule 01.04.2016
comment
@ user2407038: он хочет использовать dgs в определении gs, а это значит, что ему нужно, чтобы его определение находилось внутри rec.   -  person Jonathan Cast    schedule 01.04.2016


Ответы (1)


Я заметил, что вы используете вкладки. Я предполагаю, что ваши вкладки установлены на 4 пробела? Вкладки Haskell всегда установлены на 8 пробелов. Либо измените настройки вкладок в Sublime на 8 пробелов, либо установите Sublime для расширения вкладок до пробелов, и это должно работать.

(Очевидно, что вы должны изменить табуляцию перед dgs на четыре пробела в любом случае).

Другой вариант - поместить новую строку (и отступ) после rec, и в этом случае не имеет значения, какой длины ваши вкладки (поскольку вы последовательно используете вкладки):

master_combine = proc pi -> do 
                            -- rec cgg <- player_update >>> (initial_game --> bounds_updater) >>> iPre initial_game -< (pi, cgg)
                            rec
                                gs  <- player_update >>> (initial_game --> bounds_updater) -< (pi, dgs)
                                dgs <- iPre initial_game -< gs
                            returnA -< gs
person Jonathan Cast    schedule 01.04.2016
comment
Эпическая победа! Спасибо чувак. Было бы неплохо иметь поддержку фигурных скобок для блоков кода записи. Как и в случае нотации do. Я программирую на нескольких машинах с немного разными настройками, поэтому полагаться на отступы для указания некоторого выражения не очень приятно. - person Razvan-Ionut Olteanu; 02.04.2016