Итак, я мог бы выполнить это, используя '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