каков правильный способ, чтобы шаблон haskell обернул функцию исходной информацией (например, номером строки)

Предположим, я начинаю с функции

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

hack

Мне удалось его взломать, используя квазицитаты и поднимая строку исходного имени файла. Похоже, что 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 , но я иногда нужно взламывать.)

5
задан gatoatigrado 16 August 2011 в 03:52
поделиться