
Hi Josenildo. I would personally rewrite your code to something like this: import Data.Maybe (fromMaybe) import System.IO (hFlush, stdout) import Text.Read (readMaybe) readDef :: a -> String -> a readDef def = fromMaybe def . readMaybe isAtLeast :: [a] -> Int -> Bool isAtLeast ls n | n <= 0 = True | null ls = False | otherwise = isAtLeast ls (n-1) execNTimes :: Int -> [a] -> IO () execNTimes n lst | n <= 0 = return() | do (from, to, quit) <- getCmds if quit then let z = slice from to xs m = foldl lcm 1 z in print $ m `mod` modVal else execNTimes (n-1) $ update from to lst execNTimes (n-1) lst where modVal :: Integer modVal = 1000000007 getCmds :: IO (Int, Int, Bool) getCmds = do putStr "Enter command: " hFlush stdout cmds <- words <$> getLine if not $ cmds `isAtLeast` 3 then do putStrLn "Too few commands" getCmds else let from = readDef 0 (cmds !! 1) :: Int to = readDef 0 (cmds !! 2) :: Int quit = head cmds == "Q" in if from < 0 || to >= length lst || from > to then do putStrLn "Invalid range" getCmds else (from, to, quit) Do note that the above code is untested, and that it's written on a mobile phone. I don't know what your intentions with the code are, so I added some error messages and variable names that you might want to change. About 'xs': xs is frequently used to mean "rest of list". I would recommend using ls or lst instead to name the whole list.