Неудивительно, что следующий код вызывает исключение во время выполнения:
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
строгим или неупакованным, но, возможно, можно было бы поддерживать отдельные отладочные и оптимизированные версии. Есть ли прагма для локального отключения предупреждений для частично инициализированных записей?