I have written a safe read function for haskell (for education!). I think this is fairly idiomatic haskell code, but I'd like to know for sure. If you see anything else that could be improved, please let me know in your answer.
module ReadNum (readNum) where
main = print $ readNum "87k7"
readNum :: String -> Maybe Int
readNum xs = readNum' $ reverse xs
readNum' :: String -> Maybe Int
readNum' (x:xs) = (\y z -> y + 10 * z) <$> readChr x <*> readNum' xs
readNum' [] = Just 0
chrToNum :: [(Char, Int)]
chrToNum = [('0', 0), ('1', 1),
('2', 2), ('3', 3),
('4', 4), ('5', 5),
('6', 6), ('7', 7),
('8', 8), ('9', 9)]
readChr :: Char -> Maybe Int
readChr c = lookup c chrToNum