如何在Haskell中获取当前模块名称

时间:2011-03-29 23:37:44

标签: haskell

所以,我可以通过使用'topLevelSomething并删除。之后的最后一个标记来完成此操作,或者我可以使用moduleName 'something但是返回一个Maybe ...

是否有更简单的方法来获取当前上下文的模块名称?

所以,鉴于代码:

module My.Module.Blah where
test = magicHere

那个神奇的地方是什么让test =“My.Module.Blah”?

3 个答案:

答案 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