Вы можете сделать это с помощью GH C CallStack .
import GHC.Stack ( HasCallStack, getCallStack, callStack )
foo :: HasCallStack => String -> String
foo s = let ((name, _):_) = getCallStack callStack
in s <> ": " <> name
main :: HasCallStack => IO ()
main = putStrLn $ foo "This string is being passed to"
Производит вывод This string is being passed to: foo
Смотрите полную ссылку на мою ссылку выше описание, но в основном вы можете запросить доступ к (частичному) стеку вызовов в функции, включив ограничение HasCallStack
. Затем callStack
получает CallStack
, который изоморфен c до [(String, SrcLoc)]
, где первый элемент каждой пары является именем функции; getCallStack
преобразует абстрактный тип CallStack
в фактический список пар.
(Документы, похоже, утверждают, что ограничения HasCallStack
могут быть выведены, но в моих очень коротких экспериментах этого не произошло; если я использовал callStack
в функции без подписи, я просто получал пустой стек вызовов; вероятно, лучше всего явно написать подпись с ограничением HasCallStack
)