module TypeKwonDo where import Data.Tuple (Tuple(..), fst) import Prelude import Unsafe.Coerce (unsafeCoerce) f :: Int -> String f = unsafeCoerce unit g :: String -> Char g = unsafeCoerce unit h :: Int -> Char h x = g $ f x data A data B data C q :: A -> B q = unsafeCoerce unit w :: B -> C w = unsafeCoerce unit e :: A -> C e x = w $ q x data X data Y data Z xz :: X -> Z xz = unsafeCoerce unit yz :: Y -> Z yz = unsafeCoerce unit xform :: Tuple X Y -> Tuple Z Z xform (Tuple a b) = Tuple (xz a) (yz b) munge :: forall x y z w. (x -> y) -> (y -> (Tuple w z)) -> x -> w munge f1 f2 a = fst (f2 (f1 a))