Entero positivo de la cadena
Definir la función
enteroPositivo :: String -> Maybe Int
tal que (enteroPositivo cs) es justo el contenido de la cadena cs, si dicho contenido es un entero positivo, y Nothing en caso contrario. Por ejemplo,
enteroPositivo "235" == Just 235 enteroPositivo "-235" == Nothing enteroPositivo "23.5" == Nothing enteroPositivo "235 " == Nothing enteroPositivo "cinco" == Nothing enteroPositivo "" == Nothing
Soluciones
import Data.Maybe (listToMaybe) import Numeric (readDec) import Data.Char (isDigit) 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