2016-08-18 5 views
1

Я столкнулся со следующей ошибкой, что довольно удивительно. Я добавил поле в AppSettings в приложении Yesod (используя экранную привязку Yesod), и, к моему удивлению, все скомпилировано, хотя я ничего не делал (я ожидал добавить значение по умолчанию для построения AppSettings , но нет). Вместо этого я получил ошибку времени выполнения, указав мне, что поле отсутствует. Похоже, что единственная конструкция до AppSetting использует расширение RecordWildCards и выглядит как AppSettings{..}. Не определяя новое поле, вы не генерировали ошибку, а предупреждение (я этого не видел, потому что я работал в режиме непрерывной работы с использованием stack test --file-watch). Как это возможно? Я пытаюсь воспроизвести проблему в простом файле, и я получаю сообщение об ошибке, а не предупреждение. Так почему я предупреждаю Йесода? Это флаг компиляции или что-то еще?Recordwildcards падает во время выполнения в приложении yesod

Редактировать

Это не относится к Йесоду. Я снова сделал тест с помощью простого файла, и он генерирует предупреждение, а не ошибку.

+0

«Это флаг компиляции или что-то в этом роде?» - вероятно. Это похоже на проблему 'stack', какие настройки передаются ей в ghc? – user2407038

ответ

1

Согласно журналу изменений в GHC, «что не ошибка, это особенность»: https://ghc.haskell.org/trac/ghc/ticket/5334

Вы можете изменить это поведение, изменяя тип ваших полей строгого (предварять ! ввести имя - как !Int) - Тем не менее, вы теряете лени (больше о последствиях строгих типов: Advantages of strict fields in data types)

конечно, вы можете также сделать его ошибку, хлопая в -Werror опции компиляции, но тогда вы должны быть очень строгими о коде (нет неиспользуемых импортов, неиспользованных переменных, даже при распаковке записи и т. д.), или избавиться от -Wall и tu rn только на предупреждения, которые вы считаете важными.