-- I/O
hint = putStrLn (show x) ==> print x
-- LIST
hint = concat (map f x) ==> concatMap f x
hint "Use one map" = map f (map g x) ==> map (f . g) x
hint = (x !! 0) ==> head x
hint = take n (repeat x) ==> replicate n x
hint = (x ++ concatMap (' ':) y) ==> unwords (x:y)
hint = concat (intersperse " " x) ==> unwords x
hint = head (reverse x) ==> last x
hint "Use index" = head (drop n x) ==> (x !! n)
hint = reverse (tail (reverse x)) ==> init x
hint = isPrefixOf (reverse x) (reverse y) ==> isSuffixOf x y
-- BOOL
hint = not (a == b) ==> (a /= b)
hint = not (a /= b) ==> (a == b)
hint "Redundant if" = (if a then True else False) ==> a
hint "Redundant if" = (if a then False else True) ==> not a
hint "Redundant if" = (if a then t else (if b then t else f)) ==> if a || b then t else f
hint "Redundant if" = (if a then (if b then t else f) else f) ==> if a && b then t else f
hint "Use if" = case a of {True -> t; False -> f} ==> if a then t else f
hint "Use if" = case a of {True -> t; _ -> f} ==> if a then t else f
hint "Use if" = case a of {False -> f; _ -> t} ==> if a then t else f
-- MONAD
hint = m >>= return . f ==> liftM f m
hint = (if x then y else return ()) ==> (when x $ y)
-- LIST COMP
hint "Use a list comprehension" = (if b then [x] else []) ==> [x | b]
-- SEQ
hint "The seq is redundant" = (x `seq` x) ==> x
hint "The $! is redundant" = (id $! x) ==> x
-- MAYBE
hint = maybe x id ==> fromMaybe x
hint = maybe False (const True) ==> isJust
hint = maybe True (const False) ==> isNothing
-- COMPLEX
hint "Use isPrefixOf, and then remove the (==) test" = (take i s == t) ==> ((i == length t) && (t `isPrefixOf` s))
where _ = (isList t || isLit t) && isLit i
{-
yes = concat . map f
yes = foo . bar . concat . map f . baz . bar
yes = map f (map g x)
yes = concat.map (\x->if x==e then l' else [x])
yes = f x where f x = concat . map head
yes = concat . map f . g
yes = concat $ map f x
yes = "test" ++ concatMap (' ':) ["of","this"]
yes = concat . intersperse " "
yes = if f a then True else False
yes = if f a then False else True
yes = not (a == b)
yes = not (a /= b)
yes = if a then 1 else if b then 1 else 2
no = if a then 1 else if b then 3 else 2
yes = a >>= return . id
yes = (x !! 0) + (x !! 2)
yes = if x == e then l2 ++ xs else [x] ++ check_elem xs
yes = if b < 42 then [a] else []
yes = take 5 (foo xs) == "hello"
no = take n (foo xs) == "hello"
yes = head (reverse xs)
yes = reverse xs `isPrefixOf` reverse ys
-}
{-
-- TODO: Add RecMatch for things like map/foldr etc, with a similar entry in hints
-- more complicated, saved for later
-- map f x
redefined_map = mop
where
mop f (x:xs) = f x : mop f xs
mop f [] = []
-- map x
special_map f = mop
where
mop (x:xs) = f x : mop xs
mop [] = []
-- foldr f z x
special_foldr f z = fold
where
fold [] = z
fold (x:xs) = f x (fold xs)
-- foldl f z x
special_foldl1 f = fold
where
fold acc [] = acc
fold acc (x:xs) = fold (f x acc) xs
special_foldl2 f = fold
where
fold [] acc = acc
fold (x:xs) acc = fold xs (f x acc)
-}