Неудивительно, что исключение во время выполнения выдается следующим кодом:
data Necklace = InvalidNecklace |
Necklace { necklace_id :: Int, meow :: Int, ... }
necklace_id InvalidNecklace
Существует ли какой-то естественный способ определения значения для necklace_id
при применении к InvalidNecklace
для получения значения вместобросить исключение?
GHC завершается ошибкой с несколькими объявлениями для necklace_id, если я пытаюсь сделать очевидную вещь:
necklace_id InvalidNecklace = -1
Возможно, есть какая-то прагма, которая скажет GHC заменить это логическое объявлениеобъявление?
Я мог бы объявить InvalidNecklace
записью, добавив { necklace_id :: Int }
, но на самом деле я не могу гарантировать, что она всегда возвращает -1 и, как правило, создает ужасный беспорядок.Я мог бы просто определить:
get_necklace_id InvalidNecklace = -1
get_necklace_id x = necklace_id x
, но это частично противоречит цели записей.
Полагаю, можно создать специальное значение invalidNecklace
, написав:
invalidNecklace = Necklace { necklace_id = -1,
meow = error "meow invalidNecklace accessed", ... }
Есть ли какие-либо недостатки у этого второго подхода?Я, конечно, теряю способность делать meow
строгими или распакованными, но, возможно, можно было бы поддерживать отдельные отладочные и оптимизированные версии.Существует ли прагма для локального отключения предупреждений для частично инициализированных записей?