--

{-# Language MultiParamTypeClasses,
    FlexibleInstance,
    FlexibleContexts  #-}

-- PUT YOUR NAME AND EMAIL HERE!!!
-- without your name and email, you will not get feedback!

module HW1 where
import Data.Char (chr,ord)


-- Question # 1

data Tree a = Tip a | Fork (Tree a) (Tree a)

instance Show a => Show (Tree a) where
  show (Tip a) = "(Tip "++ show a ++ ")"
  show (Fork x y) = "(Fork " ++ show x ++" "++ show y ++")"

-- add your instances here


-- Question #2

class Convertible a b where
  into:: a -> b
  outof:: b -> a

instance Convertible ([a],[b]) [(a,b)] where
  into (x,y) = zip x y
  outof xs = unzip xs


-- add your instances here


-- Question #3

data TagExp = I Int | C Char |  F (TagExp -> TagExp) | D String [TagExp]

encodeL :: [Int] -> TagExp
encodeL [] = D "[]" []
encodeL (x:xs) = D ":" [I x,encodeL xs]

decodeL:: TagExp -> [Int]
decodeL (D "[]" []) = []
decodeL (D ":" [I x,xs]) = x : decodeL xs
decodeL other = error "Not a Tagged list"




-- Question 4

class Convertible a TagExp => Generic a where
  toString:: a -> String
  equal:: a -> a -> Bool
  flatten:: a -> [Int]
  unflatten:: [Int] -> (a,[Int])

instance (Generic a,Generic b) => Generic (a,b) where
  flatten (a,b) = flatten a ++ flatten b
  unflatten xs = ((x,y), zs)
    where (x,ys) = unflatten xs
          (y,zs) = unflatten ys

--