Safe Haskell  Safe 

Language  Haskell2010 
Extensions 

and churchEncode
form
an isomorphism between a type and its church representation of a type
Simply define an empty instance of churchDecode
(or using Church
DeriveAnyClass
)
for a type with a Generic
instance and defaulting magic will take care of the rest.
For example:
{# LANGUAGE DeriveGeneric #} {# LANGUAGE DeriveAnyClass #} data MyType = Foo Int Bool  Bar  Baz Char deriving (Generic, Church, Show)
>>>
churchEncode (Foo 1 True) (\int bool > int + 1) 0 (const 1)
2
>>>
churchDecode (\foo bar baz > bar) :: MyType
Bar
Recursive datastructures only unfold one level:
data Nat = Z  S Nat deriving (Generic,Church,Show)
>>>
:t churchEncode N
r > (Nat > r) > r
But we can still write recursive folds over such data:
nat2int :: Nat > Int nat2int a = churchEncode a 0 ((+1) . nat2int)
>>>
nat2int (S (S (S Z)))
3
Decoding recursive data is more cumbersome due to the Rep
wrappings,
but fortunately should not need to be done by hand often.
decodeNat :: (Rep Nat () > (Rep Nat () > Rep Nat ()) > Rep Nat ()) > Nat decodeNat k = churchDecode (z s > k z (s . to))
>>>
decodeNat (\z s > s . s . s . s $ z)
S (S (S (S Z)))
Synopsis
 type ChurchRep t r = ChurchSum (ToList (StripMeta (Rep t ())) (ListTerm ())) r
 class Church a where
 churchEncode :: forall r. a > ChurchRep a r
 churchDecode :: ChurchRep a (Rep a ()) > a
 churchCast :: forall a b. (Church a, Church b, ChurchRep a (Rep b ()) ~ ChurchRep b (Rep b ())) => a > b
Documentation
type ChurchRep t r = ChurchSum (ToList (StripMeta (Rep t ())) (ListTerm ())) r Source #
This is the central type for this package. Unfortunately, it's
built around type families so it's not so easy to read. A helpful
algorithm for figuring out what the ChurchRep
of a type Foo
is,
 For each constructor, write out its type signature
 Replace the
Foo
at the end of each signature withr
 Join these type signatures together with arrows
(a > b > r) > r > ...
 Append a final
> r
to the end of this
For example, for Maybe
Nothing
churchEncode :: forall r. a > ChurchRep a r Source #
Reify a type to its church representation
churchEncode :: forall r. (Generic a, GStripMeta (Rep a ()), GList (StripMeta (Rep a ())) (ListTerm ()), GChurchSum (ToList (StripMeta (Rep a ())) (ListTerm ())) r) => a > ChurchRep a r Source #
Reify a type to its church representation
churchDecode :: ChurchRep a (Rep a ()) > a Source #
Create a value from its church representation. This method may require an explicit signature.
churchDecode :: (Generic a, GBuild (MakePaths (Rep a ()) '[] '[]) (ChurchRep a (Rep a ())) (Rep a ())) => ChurchRep a (Rep a ()) > a Source #
Create a value from its church representation. This method may require an explicit signature.
Instances
Church Bool Source #  
Church Ordering Source #  
Church () Source #  
Defined in Church churchEncode :: () > ChurchRep () r Source # churchDecode :: ChurchRep () (Rep () ()) > () Source #  
Church [a] Source #  
Defined in Church churchEncode :: [a] > ChurchRep [a] r Source # churchDecode :: ChurchRep [a] (Rep [a] ()) > [a] Source #  
Church (Maybe a) Source #  
Church (Either a b) Source #  
Church (a, b) Source #  
Defined in Church churchEncode :: (a, b) > ChurchRep (a, b) r Source # churchDecode :: ChurchRep (a, b) (Rep (a, b) ()) > (a, b) Source #  
Church (a, b, c) Source #  
Defined in Church churchEncode :: (a, b, c) > ChurchRep (a, b, c) r Source # churchDecode :: ChurchRep (a, b, c) (Rep (a, b, c) ()) > (a, b, c) Source #  
Church (a, b, c, d) Source #  
Defined in Church churchEncode :: (a, b, c, d) > ChurchRep (a, b, c, d) r Source # churchDecode :: ChurchRep (a, b, c, d) (Rep (a, b, c, d) ()) > (a, b, c, d) Source #  
Church (a, b, c, d, e) Source #  
Defined in Church churchEncode :: (a, b, c, d, e) > ChurchRep (a, b, c, d, e) r Source # churchDecode :: ChurchRep (a, b, c, d, e) (Rep (a, b, c, d, e) ()) > (a, b, c, d, e) Source #  
Church (a, b, c, d, e, f) Source #  
Defined in Church churchEncode :: (a, b, c, d, e, f) > ChurchRep (a, b, c, d, e, f) r Source # churchDecode :: ChurchRep (a, b, c, d, e, f) (Rep (a, b, c, d, e, f) ()) > (a, b, c, d, e, f) Source #  
Church (a, b, c, d, e, f, g) Source #  
Defined in Church churchEncode :: (a, b, c, d, e, f, g) > ChurchRep (a, b, c, d, e, f, g) r Source # churchDecode :: ChurchRep (a, b, c, d, e, f, g) (Rep (a, b, c, d, e, f, g) ()) > (a, b, c, d, e, f, g) Source # 