所以,我可以通过使用'topLevelSomething
并删除。之后的最后一个标记来完成此操作,或者我可以使用moduleName 'something
但是返回一个Maybe ...
是否有更简单的方法来获取当前上下文的模块名称?
所以,鉴于代码:
module My.Module.Blah where
test = magicHere
那个神奇的地方是什么让test =“My.Module.Blah”?
答案 0 :(得分:10)
我认为这是一个很好的问题,所以我使用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
答案 1 :(得分:9)
使用Typeable获取当前模块名称的方法相当迂回。
module My.Module.Blah where
import Data.Typeable
data T = T deriving Typeable
test = init $ init $ show $ typeOf T
答案 2 :(得分:2)
很棒的答案。我们最终这样做了,因为它似乎有点清洁。
moduleOf 'someTopLevelThingInModule
moduleOf :: Language.Haskell.TH.Syntax.Name -> String
moduleOf = dropLastToken . show
dropLastToken :: String -> String
dropLastToken = reverse . tail . dropWhile (/= '.') . reverse