К сожалению, многие функции Template Haskell не имеют абсолютно никакой документации. Одной из таких функций является report
. Он принимает Bool
и String
и производит ошибку компиляции с указанной строкой в качестве сообщения об ошибке. Кто-нибудь знает, к чему, черт возьми, Bool
? Насколько я могу судить, любая ценность делает то же самое ...Как работает Langage.Haskell.TH.report?
6
A
ответ
9
Если Bool
- True
, сообщается об ошибке; если это False
, сообщается «предупреждение», что означает, что код шаблона будет продолжать работать, чтобы собирать больше «предупреждений».
2
Рассматривая исходный код, report
вызывает qReport
, что является методом некоторого класса под названием Quasi
. Этот метод действительно имеет некоторую проклятую документацию - хотя и крошечный фрагмент. Цитирую:
Сообщить об ошибке (
True
) или предупреждение (False
) ... но вести; использоватьfail
остановить
Так что, похоже, чтобы сделать мою аварию TH сращиваний с соответствующим сообщением об ошибке, мне просто нужно позвонить fail
вместо этого. Надеюсь, эта информация будет полезна всем, кто пытается понять это ...
У меня было ощущение, что это будет что-то вроде этого, но я не был уверен, какая из них была ошибкой, а какая была предупреждающей. Несмотря на это, кажется, что компиляция продолжается в любом случае. (!) Я бы ожидал сообщения об ошибке, чтобы остановить компиляцию, но, похоже, это не так ... – MathematicalOrchid
Из внутренней документации: «Сообщить об ошибке (True) или предупреждении (False) ... но продолжить ; используйте «fail», чтобы остановить ». Таким образом, вы должны позаботиться о том, чтобы сделать «неудачный» шаг, по-видимому; Я считаю это странным дизайнерским решением. – dflemstr
О, ты избил меня. :-) Да, странно. Из моего тестирования кажется, что просто вызвать 'fail' достаточно, чтобы остановить компиляцию, указав в качестве сообщения об ошибке строку и место сплайсинга в качестве источника проблемы. Это в значительной степени то, что я хотел ... – MathematicalOrchid