Почему это ошибка разбора в нотации do?

Рассмотрим следующий код:

foo = do
  let bar = do
    baz
  bar

Не разбирается в ghc, версия 8. Жалуется на строку, содержащую baz, Этот код анализирует, хотя:

foo = do
  let bar = do
      baz
  bar

Я нахожу это запутанным. В чем принципиальная разница между двумя версиями?

1 ответ

Решение

Проблема в том, что отступы ставятся baz в ничейной стране. Это не отступает достаточно далеко, чтобы быть частью let выражение, но оно отступает слишком далеко, чтобы быть следующей частью do выражение, содержащее let выражение.

Другие вопросы по тегам