Как получить имя текущего модуля в Haskell

Итак, я мог бы выполнить это, используя 'topLevelSomething и удалив последний токен после., или я мог бы использовать moduleName 'something, но это возвращает Maybe...

Есть ли более простой способ получить имя модуля текущего контекста?

Итак, учитывая код:

module My.Module.Blah where
test = magicHere

Что происходит в этом волшебном месте, такое что test = "My.Module.Blah"?

Ответ 1

Отличные ответы. Мы закончили тем, что сделали это так, как будто это было немного чище.

moduleOf 'someTopLevelThingInModule

moduleOf :: Language.Haskell.TH.Syntax.Name -> String
moduleOf = dropLastToken . show
dropLastToken :: String -> String
dropLastToken = reverse . tail . dropWhile (/= '.') . reverse

Ответ 2

Я думал, что это был хороший вопрос, поэтому я понял ответ, используя Template Haskell:

{-# LANGUAGE TemplateHaskell #-}
module A.B.C where

import Language.Haskell.TH
import Language.Haskell.TH.Syntax

e :: String
e = $(fmap loc_module qLocation >>= \mod ->  return (LitE (StringL mod) ))

main = print e

Ответ 3

Существует довольно окольный способ получить текущее имя модуля с помощью Typeable.

module My.Module.Blah where
import Data.Typeable

data T = T deriving Typeable
test = init $ init $ show $ typeOf T