content: module TiTest0 where
  
  default(Int)
  
  newtype Id = Id String
  newtype F f = F (f Prelude.Int)
  newtype F2 f = F2 (f Int Int)
  
  
  --liftM :: Monad m => (a->b) -> m a -> m b
  liftM f m = do x<-m; return (f x)
  
  
  lnil = length []
  
  data Tags f1 f2 a = (f1 a) :&: (f2 a)
  
  hello = "Hello, world!\n"
  hello_again = fmap id hello -- unification when type synonyms are present?
  
  lmap f xs = [f x|x<-xs]
  --bla = blaha
  
  a = Id "a"
  
  n = 1
  fn = F [n]
  fm = F (Just n)
  f2a x = F2 (x, x)
  f2b x = F2 (Left x)
  isNothing x = x==Nothing
  
  --{-
  instance Eq a => Eq (Maybe a) where
    Nothing == Nothing = True
    Just x  == Just y  = x==y
    _       == _       = False
  --}
  
  --tst = 1==2
  
  l = \ x y z -> let f x = (x,z)
                 in let s = f hello
                 in (z 'a',f x,f y,s)
  
  not' t = t==False
  
  fnot x = fmap not x
  
  i b x y = if b then x else y
  
  --id :: a -> a
  
  apply = \ f x -> f x
  
  twice f x = f (f x)
  
  --dup :: a -> (a,a)
  dup = \ x -> (x,x)
  
  --(id1,id2) = dup id
  
  three = \ x -> [x,x,x]
  
  --ones = (ones,1)
  
  --nomatch = fromJust Nothing :: a
  
  ints = id [1..]
  
  ng b x = let f y = if b then x else y
           in (f, f)
  
  
  data A a = A a | A2 B
  data B = B (A Int)
  
  instance Show a => Show (A a) where
    show (A a) = show a
    show (A2 b) = show b
  
  instance Show B where show (B a) = show a
  
  
  
  isZero x | x==0 = True
           | x/=0 = False
  
  
  happy = [toEnum 0x263a] -- ::String
  sad = [toEnum 0x2639]
  
  happy2 = "\x263a"
  sad2 = "\x2639"
  
  {-
  eq = (==) :: Eq a => a->a->Bool
  addff = fst ff+snd ff
  -}
  
  ff :: Num a => (a,a)
  ff = (four,four)
    where four = 4
  
  
  
  fib 0 = 0
  fib 1 = 0
  fib n = fib (n-1) + fib(n-2)
  
  fac 0 = 1
  fac n = n * fac(n-1)
  