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

16

所以,我可以通过使用'topLevelSomething并在最后一个点号之后删除最后一个标记,或者我可以使用moduleName 'something,但它返回一个Maybe...。

有没有更直接的方法获取当前上下文的模块名称?

那么,假设已经有以下代码:

module My.Module.Blah where
test = magicHere

那个 magicHere 的位置应该填什么,才能使得 test = "My.Module.Blah" 呢?

3个回答

13

我认为这是一个不错的问题,所以我使用模板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

2
请注意,我认为这个 Template Haskell 的部分仅在编译时工作,在运行时使用 runQ 将不起作用。 - Chris Kuklewicz

9

使用Typeable获取当前模块名称的方法比较绕。

module My.Module.Blah where
import Data.Typeable

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

3

很棒的回答。我们最终采用了这种方式,因为它看起来更加简洁。

moduleOf 'someTopLevelThingInModule

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接