, , , , . ( ImpredicativeTypes.)
, ,
type Church = forall a. (a -> a) -> (a -> a)
a -0 (.. ), Church . , , , inc.
, , , , : make Church newtype , . :
{-# LANGUAGE RankNTypes #-}
newtype Church = Church { runChurch :: forall a . (a -> a) -> (a -> a) }
zero :: Church
zero = Church (\f -> id)
inc :: Church -> Church
inc n = Church (\f -> f . runChurch n f)
add2 :: Church -> Church -> Church
add2 n = runChurch n inc