我的程序正在广泛使用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
个实例?
谢谢!
答案 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
!-}