isRowWord' :: Ord a => [a] -> [a] -> [a] -> Bool isRowWord' _ ys [] = ys == [] isRowWord' [] [] zs = isRowWord' [head zs] [] (tail zs) isRowWord' xs [] zs = if last xs <= head zs then isRowWord' (xs ++ [head zs]) [] (tail zs) else isRowWord' [] xs zs isRowWord' xs ys zs = if xs == [] || last xs <= head zs then head ys > head zs && (isRowWord' (xs ++ [head zs]) (tail ys) (tail zs)) else ys == [] && isRowWord' [] xs zs isRowWord :: Ord a => [a] -> Bool isRowWord = isRowWord' [] [] reduceWord :: Ord a => [a] -> [a] reduceWord xs | length xs <= 2 = xs | otherwise = reduceWord' (reduceWord (init xs)) (last xs) reduceWord' :: Ord a => [a] -> a -> [a] reduceWord' xs x =