openlang

Учимся по ошибкам компилятора Elm

В небольшой учебной группе мы используем сообщения об ошибках компилятора Elm как учебный материал. Каждый приносит код с намеренной ошибкой, вместе читаем сообщение, потом исправляем.

С опечатками в полях записи всё прошло отлично. Пишешь fistName, компилятор сравнивает поля и показывает firstName <-> fistName как вероятную опечатку. Все сразу видели, в чём дело, и могли объяснить своими словами. Компилятор подскажет, и вежливо. Правда.

Проблемы начались с MISSING PATTERNS. Добавляешь Failed в type Status = Idle | Loading | Failed String, не трогаешь case, и ошибка перечисляет недостающий вариант, а подсказка предлагает поставить Debug.todo как заглушку, если ветку хочется написать позже. Несколько человек вставили подсказку и на этом остановились. Компилируется же. Что показывать на экране при Failed, никто не решил, и как только выполнение доходит до этой ветки, приложение падает.

Подсказка не ошибочная. Она помогает с порядком работы. Но тому, кто учится, она, похоже, читается как «исправь вот так». Думаю в следующий раз попробовать то же самое на ReScript, там при добавлении варианта компилятор так же указывает на необработанную ветку. Если кто-то так учил, очень интересно, как это у вас прошло.

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    То, что Debug.todo проходит компилятор, для группы нормально, если долг потом возвращают. Предлагаю одно правило. Кто его написал, один раз запускает elm make --optimize, а оптимизированная сборка отказывается собирать код, где ещё есть Debug, так что заглушка не проскочит в сборку, которую кто-то выпускает.

    А если дальше попробуете ReScript, жалоба будет другой. Там switch, в котором пропущен вариант, по умолчанию даёт предупреждение, а не ошибку, так что код собирается, а предупреждение просто пролетает мимо. Хуже от этого упражнение или честнее, пока не могу решить.

  2. Ссылка на ответ

    А если сначала спрятать подсказку и попросить догадку? Показать только заголовок ошибки и недостающий вариант, и пусть каждый запишет, что должна делать эта ветка. Запомним эту догадку. Потом открываем подсказку.

    Тогда Debug.todo выглядит уже не ответом, а пометкой «ещё не решено». С упражнениями на шаблоны в OCaml было похоже. Записанная догадка держится в голове дольше, чем формулировка компилятора.

  3. Ссылка на ответ

    rook77, прятать подсказку мне нравится, но меня беспокоит, куда уйдут ответы. Если показать только пропущенный случай и спросить, что должен показывать Failed, почти все, думаю, напишут Failed _ -> text "Error". Это компилируется, никогда не падает и выбрасывает сообщение, которое нёс тип, так что проблема заглушки просто превращается в проблему пожатия плечами. Хватит ли настоящего сообщения об ошибке в примере, чтобы было видно, что подстановочный шаблон что-то теряет?

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

  1. round(2.5) даёт 2, и ученики не верят

    Ученики упорно думают, что round(2.5) равно 3, а оба языка, к которым я обычно тянусь, говорят 2. Python даёт целое 2, Julia…

    Ответы 4juliapython
  2. 3 + 4 * 2 равно 14, и это ещё простая часть

    Каждый, кто начинает со Smalltalk, рано встречает 3 + 4 * 2 и слышит, что это 14, потому что бинарные сообщения идут слева на…

    Ответы 1smalltalk
  3. Ручной перевод старого CoffeeScript как урок JavaScript

    Немодное упражнение, которое работает лучше, чем имеет на то право. Дайте ученику небольшой старый файл на CoffeeScript и поп…