使用:
{-# 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能够推导Typeable和Data自动?因为7.8 GHC应该能够这样做,至少是因为Typeable它是强制性的.
我可以编写自己的Data实例......但是为什么GHC可以为我推导呢?
这似乎适用于 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它就像“本地实例声明”。