如何在Haskell中获取当前模块名
因此,我可以通过使用如何在Haskell中获取当前模块名,haskell,Haskell,因此,我可以通过使用'topLevelSomething并删除后面的最后一个标记来实现这一点,或者我可以使用moduleName'something,但这可能会返回 有没有更直接的方法来获取当前上下文的模块名 因此,根据代码: module My.Module.Blah where test = magicHere 在这个神奇的地方会发生什么,比如test=“My.Module.Blah”?我认为这是一个很好的问题,所以我用模板Haskell找到了答案: {-# LANGUAGE Templa
'topLevelSomething
并删除后面的最后一个标记来实现这一点,或者我可以使用moduleName'something
,但这可能会返回
有没有更直接的方法来获取当前上下文的模块名
因此,根据代码:
module My.Module.Blah where
test = 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
注意,我认为Haskell模板的这一部分只在编译时起作用,在运行时使用runQ是不起作用的。