enteroPositivo :: String -> Maybe Int
enteroPositivo "" = Nothing
enteroPositivo cs | todosDigitos cs = Just (read cs)
| otherwise = Nothing
-- (todosDigitos cs) se verifica si todos los elementos de cs son
-- dígitos. Por ejemplo,
-- todosDigitos "235" == True
-- todosDigitos "-235" == False
-- todosDigitos "23.5" == False
-- todosDigitos "235 " == False
-- todosDigitos "cinco" == False
-- 1ª definición de todosDigitos (por comprensión):
todosDigitos :: String -> Bool
todosDigitos cs = and [esDigito c | c <- cs]
-- 2ª definición de todosDigitos (por recursión):
todosDigitos2 :: String -> Bool
todosDigitos2 [] = True
todosDigitos2 (c:cs) = esDigito c && todosDigitos2 cs
-- 3ª definición de todosDigitos (por recursión):
todosDigitos3 :: String -> Bool
todosDigitos3 = foldr ((&&) . esDigito) True
-- 4ª definición de todosDigitos (con all):
todosDigitos4 :: String -> Bool
todosDigitos4 = all esDigito
-- (esDigito c) se verifica si el carácter c es un dígito. Por ejemplo,
-- esDigito '5' == True
-- esDigito 'a' == False
-- 1ª definición de esDigito:
esDigito1 :: Char -> Bool
esDigito1 c = c `elem` "0123456789"
-- 2ª definición de esDigito:
esDigito2 :: Char -> Bool
esDigito2 c = c `elem` ['0'..'9']
-- 3ª definición de esDigito:
esDigito3 :: Char -> Bool
esDigito3 = (`elem` ['0'..'9'])
-- 4ª definición de esDigito:
esDigito4 :: Char -> Bool
esDigito4 c = '0' <= c && c <= '9'
-- 5ª definición de esDigito:
esDigito5 :: Char -> Bool
esDigito5 = isDigit
-- Usaremos como definición de esDigito la 5ª:
esDigito :: Char -> Bool
esDigito = esDigito5