Ir al contenido principal

Números en una cadena

Definir la función

numeros :: String -> [Int]

tal que (numeros cs) es la lista de los números enteros de la cadena cs. Por ejemplo,

λ> numeros "Esta cadena tiene 3 numeros: el 16 y el 2019 solamente."
[3,16,2019]

Soluciones

import Data.Char  (isDigit)
import Data.List  (tails, unfoldr)
import Data.Maybe (listToMaybe)

-- 1ª definición
-- =============

numeros :: String -> [Int]
numeros cs = map read (filter esNumero (words cs))

-- (esNumero cs) se verifica si la cadena no vacía cs representa
-- un número entero. Por ejemplo,
--    esNumero "2019"  ==  True
--    esNumero "20.9"  ==  False
--    esNumero "201a"  ==  False
esNumero :: String -> Bool
esNumero = all (`elem` ['0'..'9'])

-- 2ª solución
-- ===========

numeros2 :: String -> [Int]
numeros2 cs = map read (filter (all isDigit) (words cs))

-- 3ª solución
-- ===========

numeros3 :: String -> [Int]
numeros3 = map read . filter (all isDigit) . words

-- 4ª solución
-- ===========

numeros4 :: String -> [Int]
numeros4 = unfoldr (listToMaybe . concatMap reads . tails)