如何在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是不起作用的。