{-# LANGUAGE MultiParamTypeClasses, TypeFamilies, FlexibleContexts #-}

class (There a ~ b, BackAgain b ~ a) => Foo a b where
    type There a
    type BackAgain b
    there :: a -> b
    back :: b -> a
    tickle :: b -> b

instance Foo Char Int where
    type There Char = Int
    type BackAgain Int = Char
    there = fromEnum
    back = toEnum
    tickle = (+1)

--test :: (Foo a b) => a -> a
test = back . tickle . there

--main :: IO ()
main = print $ test 'F'
