2015-07-30 1 views
1

Моя программа широко использует Uniplate.Data и хочет улучшить ее производительность.Получение Uniplate с Derive

В настоящее время я получаю 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 экземпляров автоматически?

Спасибо!

ответ

2

Как сказано в сообщении об ошибке, UniplateDirect не поддерживает режим TH из derive, так что вы должны использовать автономную исполняемую версию как препроцессор для создания экземпляра Uniplate.

Вы можете сделать это, добавив {-! !-} директивы и установки derive как препроцессор для запуска на GHC:

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

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

{-! 
deriving instance UniplateDirect Expr 
!-} 

Загрузка это в GHCi для быстрой проверки подтверждает, у вас есть свой экземпляр:

[1 of 1] Compiling Main    (SO31725183.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> :i Expr 
data Expr = Val Int | Neg Expr | Add Expr Expr 
     -- Defined at D:\cygwin\tmp\ghc13224_0\ghc13224_3.hspp:6:1 
instance Uniplate Expr 
    -- Defined at D:\cygwin\tmp\ghc13224_0\ghc13224_3.hspp:16:10 

 Смежные вопросы

  • Нет связанных вопросов^_^