用Derive导出Uniplate

时间:2015-07-30 13:29:36

标签: haskell uniplate

我的程序正在广泛使用Uniplate.Data,并希望提高其性能。

目前,我正在使用Data GHC扩展程序自动派生DeriveDataTypeable个实例。

{-# LANGUAGE DeriveDataTypeable #-}

import Data.Data
import Data.Generics.Uniplate.Data

data Expr = Val Int
          | Neg Expr
          | Add Expr Expr
  deriving (Data,Typeable)

由于性能优越,Uniplate.Data package description建议使用Uniplate.Direct。 后者需要为数据类型编写明确的Uniplate实例,并为此推荐Derive工具。

尝试使用Derive自动派生实例时:

{-# LANGUAGE TemplateHaskell #-}
import Data.DeriveTH
import Data.Generics.Uniplate.Direct

data Expr = Val Int
          | Neg Expr
          | Add Expr Expr

$( derive makeUniplateDirect ''Expr )

我收到以下错误:

Exception when trying to run compile-time code:
  Derivation of UniplateDirect does not yet support Template Haskell, requires info for Expr
Code: derive makeUniplateDirect ''Expr

是否有其他方法可以自动导出Uniplate.Direct个实例?

谢谢!

1 个答案:

答案 0 :(得分:2)

正如错误消息所示, ACAccountStore *accountStore = [[ACAccountStore alloc] init]; ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) { if(granted) { //Now you can do everything with your twitter account. }}]; 不支持UniplateDirect的TH模式,因此您必须使用独立的可执行版本作为预处理器来生成derive实例。< / p>

您可以通过添加Uniplate指令并将{-! !-}设置为GHC运行的预处理器来实现此目的:

derive

将其加载到GHCi进行快速测试可确认您拥有实例:

{-# OPTIONS_GHC -F -pgmFderive -optF-F #-}
import Data.Generics.Uniplate.Direct

data Expr = Val Int
          | Neg Expr
          | Add Expr Expr

{-!
deriving instance UniplateDirect Expr
!-}