Производный 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
Другие вопросы по тегам