Add NoDataDeriving language extension
This branch adds the new language extension NoDataDeriving
for disabling the implicit deriving of Prelude.Data
instances. For example, the following program will no longer compile:
{-# LANGUAGE NoDataDeriving #-}
data X = A | B
data Y
requireData :: Data a => a
requireData = failed
main :: IO ()
main = do
return (requireData :: X)
return (requireData :: Y)
return ()
Error:
Missing instance for Prelude.Data X
in explicitly typed expression
requireData
Error:
Missing instance for Prelude.Data Y
in explicitly typed expression
requireData
The idea behind making this a language extension (instead of e.g. a simple flag) is that is similar in spirit to NoImplicitPrelude
and that it changes core language semantics. Additionally this opens up the possibility of having NoImplicitPrelude
imply NoDataDeriving
in the future.