Предположим, я начинаю с функции
fromJust Nothing = error "fromJust got Nothing!"
fromJust (Just x) = x
Затем я хочу добавить информацию об источнике через Template Haskell для улучшения сообщений об ошибках. Давайте представим, что я могу добавить дополнительный параметр к функции
fromJust' loc Nothing = error $ "fromJust got Nothing at " ++ (loc_filename loc)
fromJust' loc (Just x) = x
, а затем получить макрос fromJust
, который я мог бы использовать в исходном коде, например,
x = $fromJust $ Map.lookup k m
Мне удалось его взломать, используя квазицитаты и поднимая строку исходного имени файла. Похоже, что Loc
не имеет экземпляра Lift. Есть ли способ лучше?
fromJustErr' l (Nothing) =
error $ printf "[internal] fromJust error\
\\n (in file %s)" l
fromJustErr' l (Just x) = x
fromJustErr = do
l <- location
let fn = loc_filename l
fnl :: Q Exp = TH.lift fn
[| fromJustErr' $fnl |]
Спасибо!
(Я знаю, что лучше использовать fmap
через функтор Maybe
, чем использовать fromJust
, но я иногда нужно взламывать.)