content: {-# LANGUAGE RankNTypes #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  
  
  module Polymorphism where
  
  
  foo :: a -> a -> a
  foo = undefined
  
  foo' :: forall a. a -> a -> a
  foo' = undefined
  
  bar :: a -> b -> (a, b)
  bar = undefined
  
  bar' :: forall a b. a -> b -> (a, b)
  bar' = undefined
  
  baz :: a -> (a -> [a -> a] -> b) -> b
  baz = undefined
  
  baz' :: forall a b. a -> (a -> [a -> a] -> b) -> b
  baz' = undefined
  
  quux :: a -> (forall a. a -> a) -> a
  quux x f = f x
  
  quux' :: forall a. a -> (forall a. a -> a) -> a
  quux' x f = f x
  
  
  num :: Num a => a -> a -> a
  num = undefined
  
  num' :: forall a. Num a => a -> a -> a
  num' = undefined
  
  eq :: (Eq a, Eq b) => [a] -> [b] -> (a, b)
  eq = undefined
  
  eq' :: forall a b. (Eq a, Eq b) => [a] -> [b] -> (a, b)
  eq' = undefined
  
  mon :: Monad m => (a -> m a) -> m a
  mon = undefined
  
  mon' :: forall m a. Monad m => (a -> m a) -> m a
  mon' = undefined
  
  
  norf :: a -> (forall a. Ord a => a -> a) -> a
  norf x f = x
  
  norf' :: forall a. a -> (forall a. Ord a => a -> a) -> a
  norf' x f = x
  
  
  plugh :: forall a. a -> a
  plugh x = x :: a
  
  thud :: forall a b. (a -> b) -> a -> (a, b)
  thud f x =
      (x :: a, y) :: (a, b)
    where
      y = (f :: a -> b) x :: b
  
  rankn :: (forall a1. a1 -> b) -> a2 -> b
  rankn (g :: forall a1. a1 -> b) x = g x :: b
  