所以,我可以通过使用'topLevelSomething
并在最后一个点号之后删除最后一个标记,或者我可以使用moduleName 'something
,但它返回一个Maybe...。
有没有更直接的方法获取当前上下文的模块名称?
那么,假设已经有以下代码:
module My.Module.Blah where
test = magicHere
那个 magicHere 的位置应该填什么,才能使得 test = "My.Module.Blah" 呢?
所以,我可以通过使用'topLevelSomething
并在最后一个点号之后删除最后一个标记,或者我可以使用moduleName 'something
,但它返回一个Maybe...。
有没有更直接的方法获取当前上下文的模块名称?
那么,假设已经有以下代码:
module My.Module.Blah where
test = magicHere
那个 magicHere 的位置应该填什么,才能使得 test = "My.Module.Blah" 呢?
我认为这是一个不错的问题,所以我使用模板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
使用Typeable获取当前模块名称的方法比较绕。
module My.Module.Blah where
import Data.Typeable
data T = T deriving Typeable
test = init $ init $ show $ typeOf T
很棒的回答。我们最终采用了这种方式,因为它看起来更加简洁。
moduleOf 'someTopLevelThingInModule
moduleOf :: Language.Haskell.TH.Syntax.Name -> String
moduleOf = dropLastToken . show
dropLastToken :: String -> String
dropLastToken = reverse . tail . dropWhile (/= '.') . reverse