packages feed

hermit-0.1.1.0: examples/concatVanishes/HList.hs

module HList
       ( H
       , repH
       , absH
       ) where

type H a = [a] -> [a]

{-# INLINE repH #-}
repH :: [a] -> H a
repH xs = (xs ++)

{-# INLINE absH #-}
absH :: H a -> [a]
absH f = f []

-- The "Algebra" for repH
{-# RULES "repH ++" forall xs ys .     repH (xs ++ ys) = repH xs . repH ys #-}
{-# RULES "repH []" 	               repH [] = id                        #-}
{-# RULES "repH (:)" forall x xs .     repH (x:xs) = ((:) x) . repH xs     #-}

-- Should be in the "List" module
{-# RULES "(:) ++" forall x xs ys .    (x:xs) ++ ys = x : (xs ++ ys)       #-}
{-# RULES "[] ++"  forall xs .         [] ++ xs     = xs                   #-}
{-# RULES "++ []"  forall xs .         xs ++ []     = xs                   #-}

-- Should be somewhere else
{-# RULES ". id" forall f .          f . id = f                          #-}
{-# RULES "id ." forall f .          id . f = f                          #-}


-- has preconditon
{-# RULES "rep-abs-fusion" forall h .  repH (absH h) = h                   #-}