Производный Uniplate с производным
Моя программа широко использует Uniplate.Data, и я хочу улучшить ее производительность.
В настоящее время я получаю Data
экземпляры автоматически с помощью DeriveDataTypeable
Расширение GHC.
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Data.Generics.Uniplate.Data
data Expr = Val Int
| Neg Expr
| Add Expr Expr
deriving (Data,Typeable)
В описании пакета Uniplate.Data рекомендуется использовать Uniplate.Direct из-за превосходной производительности. Последнее требует написания явного Uniplate
экземпляры для типов данных, и порекомендуйте инструмент извлечения для этого.
При попытке получить экземпляры автоматически с помощью 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 ответ
Как говорится в сообщении об ошибке, 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