# data-default-extra
[][data-default-extra]
[](http://packdeps.haskellers.com/reverse/data-default-extra)
[][Haskell.org]
[][tl;dr Legal: BSD3]
[](https://travis-ci.org/trskop/data-default-extra)
# Description
An alternative to [data-default][] package, but built on top of the same
underlying package [data-default-class][]. This package provides a lot of
additional instances for `Default` type class.
`Default` type class provides a default value (`def`) of a type. In case when a
particluar type has an instance for `Monoid`, then the default value should be
`mempty`, otherwise it can cause a great deal of confusion.
One must understand, that `Default` type class, has no axioms associated with
it. Its purpose is to minimize:
* Number of imports.
* Number of introduced definitions that are part of an API.
* Complexity of building more complicated "default values" out of simpler
"default values".
* Cognitive overhead. (Reduction of cognitive overhead is partially a
consequence of reducing above issues.)
As one may notice, most of the listed problems, that `Default` type class tries
to solve, to various degrees of success, are for human benefit, and not
theoretically founded. Because of this, please always try hard to define
sensible instances of `Default`. Most importantly, document what `def` means
for particular type, and always check that `def` is sensible, by testing it on
a real world sample of human beings, one is not a big enough sample.
That said, using `Default` may not always be a good idea. If it breaks people's
mental models, or theoretical models with real axioms, then just don't use it.
This package, in most part, just reexports a set of packages that provide
additional instances for [data-default-class][] package.
## GHC Generics
Create `Default` instances using [GHC Generics][].
Usage example:
```Haskell
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DefaultSignatures #-}
import GHC.Generics (Generic)
import Data.Default (Default)
data MyType = MyType Int (Maybe String)
deriving (Generic, Show)
instance Default MyType
```
```
λ> def :: MyType
MyType 0 Nothing
```
One can also use `DeriveAnyClass` language extension:
```Haskell
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
import GHC.Generics (Generic)
import Data.Default (Default)
data MyType = MyType Int (Maybe String)
deriving (Default, Generic, Show)
```
Be aware that `DeriveAnyClass` doesn't work well together with
`GeneralizedNewtypeDeriving` on some versions of GHC. See [GHC issue #10598][]
## License
The BSD 3-Clause License, see [LICENSE][] file for details.
## Contributions
Contributions, pull requests and bug reports are welcome! Please don't be
afraid to contact author using GitHub or by e-mail.
[data-default]:
https://hackage.haskell.org/package/data-default
"Hackage: data-default"
[data-default-class]:
https://hackage.haskell.org/package/data-default
"Hackage: data-default-class"
[data-default-extra]:
https://hackage.haskell.org/package/data-default-extra
"Package data-default-extra on Hackage"
[GHC Generics]:
https://wiki.haskell.org/GHC.Generics
"GHC.Generics on HaskellWiki"
[GHC issue #10598]:
https://ghc.haskell.org/trac/ghc/ticket/10598
"GHC issue #10598: DeriveAnyClass and GND don't work well together"
[Haskell.org]:
http://www.haskell.org
"The Haskell Programming Language"
[LICENSE]:
https://github.com/trskop/data-default-extra/blob/master/extra/LICENSE
"License of data-default-extra package."
[tl;dr Legal: BSD3]:
https://tldrlegal.com/license/bsd-3-clause-license-%28revised%29
"BSD 3-Clause License (Revised)"