从同一个模块中检索注解
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 [])
假设我定义了自己的注解类型:
{-# 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 [])