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

men*_*ics 14 haskell

所以,我可以通过使用'topLevelSomething和删除之后的最后一个令牌来实现这一点,或者我可以使用moduleName 'something但是返回一个Maybe ...

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

所以,鉴于代码:

module My.Module.Blah where
test = magicHere
Run Code Online (Sandbox Code Playgroud)

那个魔法在哪里,测试="My.Module.Blah"?

Chr*_*icz 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
Run Code Online (Sandbox Code Playgroud)

  • Template Haskell在运行时的工作频率是多少? (6认同)
  • 请注意,我认为Template Haskell的这一位仅在编译时有效,在运行时使用runQ将不起作用。 (2认同)

aug*_*tss 9

有一种相当迂回的方式来使用Typeable获取当前模块名称.

module My.Module.Blah where
import Data.Typeable

data T = T deriving Typeable
test = init $ init $ show $ typeOf T
Run Code Online (Sandbox Code Playgroud)


men*_*ics 4

很好的答案。我们最终这样做了,因为它看起来更干净一些。

moduleOf 'someTopLevelThingInModule

moduleOf :: Language.Haskell.TH.Syntax.Name -> String
moduleOf = dropLastToken . show
dropLastToken :: String -> String
dropLastToken = reverse . tail . dropWhile (/= '.') . reverse
Run Code Online (Sandbox Code Playgroud)