导出GADT的可分类和数据?

fho*_*fho 5 ghc gadt deriving

使用:

{-# LANGUAGE GADTs #-}                                                                                                                                                                                                                       
{-# LANGUAGE StandaloneDeriving #-}                                                                                                                                                                                                          
{-# LANGUAGE DeriveDataTypeable #-} 
Run Code Online (Sandbox Code Playgroud)

并给出以下数据类型:

data Event a where                                                                                                                                                                                                                           
    PureE  :: a                   -> Event a                                                                                                                                                                                                 
    MapE   :: (a -> b) -> Event a -> Event b                                                                                                                                                                                                 

deriving instance Typeable Event                                                                                                                                                                                                             
deriving instance Data a => Data (Event a)  
Run Code Online (Sandbox Code Playgroud)

我的目标是使用uniplate需要Data实例的包.

是GHC能够推导TypeableData自动?因为7.8 GHC应该能够这样做,至少是因为Typeable它是强制性的.

我可以编写自己的Data实例......但是为什么GHC可以为我推导呢?

Dan*_*eng 0

这似乎适用于 GHC 8.10.7:

{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DeriveDataTypeable #-}

import Data.Data

data Event a where
    PureE  :: a                   -> Event a
    MapE   :: (a -> b) -> Event a -> Event b

deriving instance Typeable Event
deriving instance (forall b. Data b) => Data (Event a)
Run Code Online (Sandbox Code Playgroud)

诀窍是量化约束(forall b. Data b) => ...,它允许 GHC按需实例化Data b任何类型。b它就像“本地实例声明”。