所以,我可以通过使用'topLevelSomething和删除之后的最后一个令牌来实现这一点,或者我可以使用moduleName 'something但是返回一个Maybe ...
是否有更简单的方法来获取当前上下文的模块名称?
所以,鉴于代码:
module My.Module.Blah where
test = magicHere
Run Code Online (Sandbox Code Playgroud)
那个魔法在哪里,测试="My.Module.Blah"?
Chr*_*icz 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
Run Code Online (Sandbox Code Playgroud)
有一种相当迂回的方式来使用Typeable获取当前模块名称.
module My.Module.Blah where
import Data.Typeable
data T = T deriving Typeable
test = init $ init $ show $ typeOf T
Run Code Online (Sandbox Code Playgroud)
很好的答案。我们最终这样做了,因为它看起来更干净一些。
moduleOf 'someTopLevelThingInModule
moduleOf :: Language.Haskell.TH.Syntax.Name -> String
moduleOf = dropLastToken . show
dropLastToken :: String -> String
dropLastToken = reverse . tail . dropWhile (/= '.') . reverse
Run Code Online (Sandbox Code Playgroud)