HList-0.3.0: examples/broken/TypeEqTTypeable.hs
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}
{-
The HList library
(C) 2004, Oleg Kiselyov, Ralf Laemmel, Keean Schupke
An implementation of a type equality predicate in terms
of type-level type representations and their comparison.
This approach works for GHC and Hugs.
-}
module TypeEqTTypeable where
import Data.HList.FakePrelude
import TTypeable
-- Generic implementation of the type equality predicate
instance ( TTypeable t tt
, TTypeable t' tt'
, HEq tt tt' b
)
=> TypeEq t t' b
-- For conciseness
type Integer3 = Integer->Integer->Integer
testTTypeable :: [String]
testTTypeable
= [
show$ typeEq not (&&),
show$ typeEq not not,
{-
We got this:
Context reduction stack overflow; size = 21
Use -fcontext-stack20 to increase stack size to (e.g.) 20
So we reduced the test suite a bit.
-}
-- show$ typeEq (&&) (||),
-- show$ typeEq ((+)::Integer3) ((-)::Integer3),
-- show$ typeEq ((*)::Integer3) ((*)::Integer3),
-- show$ typeEq ((*)::Integer3) not,
-- show$ typeEq True False,
show$ typeEq (1::Integer) True,
show$ typeEq False ((+)::Integer3),
show$ typeEq (||) ((+)::Integer3),
show$ typeEq (undefined::Fix Maybe) True,
show$ typeEq (undefined::Fix Maybe) (undefined::Fix []),
show$ typeEq (undefined::Fix Maybe) (undefined::Fix Maybe)
]