{-# LANGUAGE RankNTypes #-}

-- A classic test for type inference
-- Taken from "Haskell and principal types", Section 3
-- by Faxen, in the Haskell Workshop 2003, pp88-97

module ShouldCompile where

import GHC.List (null)
import Prelude hiding (null)

class HasEmpty a where
  isEmpty :: a -> Bool

instance HasEmpty [a] where
  isEmpty x = null x

instance HasEmpty (Maybe a) where
  isEmpty Nothing  = True
  isEmpty (Just x) = False

test1 y
  =  (null y)
  || (let f :: forall d. d -> Bool
          f x = isEmpty (y >> return x)
      in f y)

test2 y
  =  (let f :: forall d. d -> Bool
          f x = isEmpty (y >> return x)
      in f y)
  || (null y)

