2011-03-29 76 views
13

所以,我可以通過使用'topLevelSomething後刪除最後一個令牌做到這一點,或者我可以用moduleName 'something但返回也許......如何在Haskell獲取當前模塊的名稱

有沒有更直接獲取當前上下文的模塊名稱的方法?

因此,給予代碼:

module My.Module.Blah where 
test = magicHere 

什麼在magicHere點,使得測試= 「My.Module.Blah」 去?

回答

1

重要的答案。我們最終這樣做,因爲它看起來有點乾淨。

moduleOf 'someTopLevelThingInModule 

moduleOf :: Language.Haskell.TH.Syntax.Name -> String 
moduleOf = dropLastToken . show 
dropLastToken :: String -> String 
dropLastToken = reverse . tail . dropWhile (/= '.') . reverse 
9

我認爲這是一個很好的問題,所以我想通了,使用模板哈斯克爾答案:

{-# 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

請注意,我認爲模板哈斯克爾的這一點只能在編譯時工作,在運行時使用runQ將不起作用。 – 2011-03-30 00:44:20

+6

模板Haskell在運行時的工作頻率如何? – 2011-03-30 02:04:40

8

有一個相當迂迴的方式來獲得使用分型當前模塊的名稱。

module My.Module.Blah where 
import Data.Typeable 

data T = T deriving Typeable 
test = init $ init $ show $ typeOf T