A typeclass and set of functions for working with newtypes. Fork of the code published by Darius Jahandarie here, with the addition of generics.
The 'Newtype' typeclass and related functions: op
, ala
, ala'
, under
.
Primarly pulled from Conor McBride's Epigram work. Some examples:
-- foldMaps the list ala the Sum newtype. This results in 10.
ala Sum foldMap [1,2,3,4]
-- foldMaps the list ala the Product newtype. This results in 24.
ala Product foldMap [1,2,3,4]
-- foldMaps the list ala the Endo newtype. This results in 8.
ala Endo foldMap [(+1), (+2), (subtract 1), (*2)] 3
NB: Data.Foldable.foldMap
is a generalized mconcatMap
which is a generalized concatMap
.
This package includes Newtype
instances for all the (non-GHC/foreign) newtypes in base (as seen in the examples).
However, there are neat things you can do with this with /any/ newtype and you should definitely define your own 'Newtype' instances for the power of this library.
For example, see ala Cont traverse
, with the proper Newtype
instance for Cont.
This could of course be eased with the addition of generics for version 0.3:
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
(...)
newtype Example = Example Int {deriving Generic)
instance Newtype Example