Улучшатся ли сообщения об ошибках, если мы сможем отключить функции? - программирование

Улучшатся ли сообщения об ошибках, если мы сможем отключить функции?

Вдохновленный это reddit обсуждение, мне интересно, есть ли какие-либо технические препятствия на пути подхода "Dr Scheme" чтобы помочь начинающим, когда дело доходит до понимания сообщений об ошибках. Речь идет о печально известном

Prelude> 1 "doesn't"

<interactive>:3:1:
    No instance for (Num ([Char] -> t0))
      arising from the literal `1'
    Possible fix: add an instance declaration for (Num ([Char] -> t0))
    In the expression: 1
    In the expression: 1 "doesn't"
    In an equation for `it': it = 1 "doesn't"

Предположим, что мы должны сделать локальное предположение, что программист не объявит никаких новых экземпляров. Действительно, в Haskell можно пройти долгий путь, взаимодействуя только с классами прелюдии только через deriving, поэтому это предположение нереально для новичков. При таком предположении вышеупомянутое сообщение об ошибке будет находиться рядом с точкой. Можем ли мы улучшить его? Нам еще нужно выяснить, как много говорить о типе 1, но мы могли бы быть более прямым в этой проблеме.

Существуют ли другие возможности перефразировать сообщения об ошибках на основе реалистичных упрощающих предположений? Обратите внимание: я задаю вопрос об изменении текста сообщений об ошибках на основе модели опыта программиста: я не рассматриваю локально какие-либо изменения, при которых код считается ошибочным (например, предполагая, что новички будут использовать перегруженные вещи на специализированных типы, устраняющие неоднозначность).

Последующая мысль: содержит ли текст существующих сообщений об ошибках достаточную информацию для поддержки таких преобразований, предполагая, что "файл конфигурации" моделирует учащегося? То есть, может ли предприимчивый хакер реализовать постпроцессор для повышения разборчивости для ghci, не беспокоя занятых людей в штаб-квартире?

4b9b3361

Ответ 1

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

С одной стороны, ошибки, с которыми сталкиваются новички, действительно отличаются от других? Просто потому, что я знаю, как интерпретировать случай "нет Num для этой абсурдной вещи, которая явно не является числовым типом", ошибка не означает, что я не буду признавать, что GHC более четко указывает, какая костяная вещь, которую я сделал, чтобы спровоцировать такое сообщение.

Я бы предположил, что обстоятельства, при которых новичок или эксперт будут писать экземпляры или какой-либо другой "продвинутый" код, очень мало отличаются. Новичок, однако, будет кодировать в этих условиях гораздо реже, с инклюзивной нижней границей "никогда".

Если вы хотите изолировать новичков от тайных углов языка, убедитесь, что они вообще не сталкиваются с ними. Например, (ha, ha), есть аргумент, который следует сделать для того, чтобы избежать классов типов полностью, когда вы впервые вводите язык.

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

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

Предположим, что вместо этого сделаем предположение, что программист не объявит экземпляры-сироты, где класс и/или тип определены в отчете Haskell. Это предположение является наиболее реалистичным для новичков и, по сути, представляется разумным как общее правило.

Добавление такого экземпляра из-за ошибки компилятора вообще правдоподобно в очень немногих ситуациях. С вопиющим и изящным исключением монархической писательской монады (если только это не было исправлено с тех пор, как я последний раз проверял), сироты для стандартного класса и типа кажутся чрезвычайно маловероятными, и одно или другое должно возникать только тогда, когда библиотека неожиданно упустила некоторые из них экземпляров, или достаточно старых и пыльных, чтобы предшествовать распространенности таких вещей, как Applicative или Foldable. В любом случае, любой, кто действительно хочет получить такой экземпляр, можно смело предположить, что он знает, что он делает достаточно хорошо, чтобы интерпретировать сообщение об ошибке GHC, каким бы оно ни было.

Но достаточно об этом конкретном примере.

Существуют ли другие возможности перефразировать сообщения об ошибках на основе реалистичных упрощающих предположений?

Скорее всего, но мы также очень далеки от исчерпания пространства реалистичных усложняющих предположений!

Точка вышеописанного отступления на экземплярах заключается в том, что, используя информацию, уже имеющуюся в распоряжении компилятора и эвристики, которые исследуют более широкий контекст (например, когда определенные вещи определены, чтобы отличить вышеупомянутый пример от не-сиротских экземпляров) сообщения об ошибках могут быть улучшены в целом.

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

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

Рассмотрим два других сообщения об ошибках, которые хронически носят новички: жалобы на сопоставление "жестких переменных типа" и жалобы на "бесконечные типы". Перефразировка может несколько улучшить некоторые из них, но не включает в себя руководство по полиморфизму в каждом сообщении об ошибке, которое не сильно поможет новичкам исправить свой код, если вы не можете интерпретировать соответствующее выражение и тип достаточно хорошо, чтобы быть конкретным в этой причине.

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


Самое большое препятствие для любого из этого, я ожидаю, - не реализация. Скорее, это решение, в котором эвристика улучшала бы сообщения об ошибках, а не выполняла бы противоположное. Без базы объективных данных это что-то вроде игры с ошибками (га, га). Было бы очень интересно собрать большой обзор ошибок, с которыми сталкиваются программисты Haskell (в основном промежуточные или начинающие), и, самое главное, какие фактические изменения они сделали для решения проблемы.

Ответ 2

Я считаю, что подпапка Helium Haskell является попыткой сделать это. Прошло много времени с тех пор, как я попробовал это, но IIRC, он дал гораздо лучшие сообщения об ошибках, чем GHC.