从同一个模块中检索注解

Retrieving annotations from the same module

假设我定义了自己的注解类型:

{-# LANGUAGE DeriveDataTypeable #-}
module Def where

import Data.Data

data MyAnn = MyAnn Int deriving (Show, Typeable, Data)

和一些模板 Haskell 函数来访问它:

module TH where

import Def
import Language.Haskell.TH.Syntax

myAnn :: Name -> Q Exp
myAnn name = do
    [MyAnn x] <- reifyAnnotations (AnnLookupName name)
    lift x

我现在想这样使用它:

{-# LANGUAGE TemplateHaskell #-}
module Client where

import Def
import TH

x :: ()
x = ()
{-# ANN x (MyAnn 42) #-}

y :: Int
y = $(myAnn 'x)

但这失败了,因为 y 定义中的 myAnn 调用从 reifyAnnotations 中获取了一个空列表。

如果我像这样拆分 Client 就可以了:

module Client1 where

import Def

x :: ()
x = ()
{-# ANN x (MyAnn 42) #-}

{-# LANGUAGE TemplateHaskell #-}
module Client2 where

import Client1
import TH

y :: Int
y = $(myAnn 'x)

有没有办法让像整体式 Client 模块这样的东西工作?

根据the docs,这似乎是预期的行为:

Accordingly, the type environment seen by reify includes all the top-level declarations up to the end of the immediately preceding declaration group, but no more.

解决您的问题的有效方法是 通过包含一个空的顶级声明拼接来强制开始一个单独的声明组,即 just

$(return [])