所以,我可以通過使用'topLevelSomething
後刪除最後一個令牌做到這一點,或者我可以用moduleName 'something
但返回也許......如何在Haskell獲取當前模塊的名稱
有沒有更直接獲取當前上下文的模塊名稱的方法?
因此,給予代碼:
module My.Module.Blah where
test = magicHere
什麼在magicHere點,使得測試= 「My.Module.Blah」 去?
所以,我可以通過使用'topLevelSomething
後刪除最後一個令牌做到這一點,或者我可以用moduleName 'something
但返回也許......如何在Haskell獲取當前模塊的名稱
有沒有更直接獲取當前上下文的模塊名稱的方法?
因此,給予代碼:
module My.Module.Blah where
test = magicHere
什麼在magicHere點,使得測試= 「My.Module.Blah」 去?
重要的答案。我們最終這樣做,因爲它看起來有點乾淨。
moduleOf 'someTopLevelThingInModule
moduleOf :: Language.Haskell.TH.Syntax.Name -> String
moduleOf = dropLastToken . show
dropLastToken :: String -> String
dropLastToken = reverse . tail . dropWhile (/= '.') . reverse
我認爲這是一個很好的問題,所以我想通了,使用模板哈斯克爾答案:
{-# 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
有一個相當迂迴的方式來獲得使用分型當前模塊的名稱。
module My.Module.Blah where
import Data.Typeable
data T = T deriving Typeable
test = init $ init $ show $ typeOf T
請注意,我認爲模板哈斯克爾的這一點只能在編譯時工作,在運行時使用runQ將不起作用。 – 2011-03-30 00:44:20
模板Haskell在運行時的工作頻率如何? – 2011-03-30 02:04:40