|||||||||||||||||||||||||||||||||||||||||||||||| || Part 1 decode_hex_string [] = [] decode_hex_string ('+':xs) = ' ': decode_hex_string xs decode_hex_string ('%':x:y:xs) = c : decode_hex_string xs where c = (decode (a + b)) a = (hex_num x) * 16 b = (hex_num y) decode_hex_string ('%':xs) = error "No hex number to decode." decode_hex_string (x:xs) = x : decode_hex_string xs || Gives the decimal value of a hexidecimal number hex_num x = numval [x], if (digit x) hex_num x = f, if (x >= 'a') where f = ((code x) - (code 'a')) + 10, if (x <= 'f') hex_num x = f, if (x >= 'A') where f = ((code x) - (code 'A')) + 10, if (x <= 'F') |||||||||||||||||||||||||||||||||||||||||||||||| || Part 2 paren ::= LP num | RP num || tokenize_parens :: [char]->[paren] || tokenize_parens "()[/*()[]*/]" || => [LP 1,RP 1,LP 2,LP 3,LP 1,RP 1,LP 2,RP 2,RP 3,RP 2] tokenize_parens ('(':rest) = LP 1 : tokenize_parens rest tokenize_parens (')':rest) = RP 1 : tokenize_parens rest tokenize_parens ('[':rest) = LP 2 : tokenize_parens rest tokenize_parens (']':rest) = RP 2 : tokenize_parens rest tokenize_parens ('/':'*':rest) = LP 3 : tokenize_parens rest tokenize_parens ('*':'/':rest) = RP 3 : tokenize_parens rest tokenize_parens [] = [] tokenize_parens else = error "bad paren" || balanced (tokenize_parens "()[/*()[]*/]") || => True balanced = bsr [] where bsr [] [] = True || done. bsr (RP x:LP x:stack) list = bsr stack list || reduce. bsr stack [] = False || error. bsr stack (p:list) = bsr (p:stack) list || shift. || variation of balance that reduces as it shifts balanced2 = helper [] where helper [] [] = True helper x [] = False helper x (LP num:ys) = helper (LP num:x) ys helper (LP num:xs) (RP num:ys) = helper xs ys