Stack Overflow en español Asked by Logan on January 13, 2021
Resolví este ejercicio en Haskell
. Ahora lo tengo que hacer sin recursión, y usando composición de funciones predefinidas.
ConLongitud :: Int -> [String] -> Int
ConLongitud _ [] = 0
ConLongitud n (x:xs)
| n == length x = 1 + ConLongitud n xs
| otherwise = ConLongitud n xs
Básicamente, lo que hace esta función es contar las cadenas que tienen una longitud especificada. Lo primero es filtrar la lista de cadenas a las que tengan la longitud buscada y luego contarlas:
conLongitud :: Int -> [String] -> Int
conLongitud n xs = length ys
where ys = [x | for x in xs, length x == n]
Pero el problema te dice "composición de funciones". En lugar de usar una compresión de listas se podría usar filter
, algo así:
ys = filter (n==) (map length xs)
Esta definición recorre la lista dos veces, una para calcular la longitud de todas las cadenas y otra vez para filtrar. Se puede hacer en un paso:
ys = filter (s -> n == length s) xs
O en pointfree:
ys = filter ((n==) . length) xs
Con ello obtendríamos la definición final:
conLongitud :: Int -> [String] -> Int
conLongitud n = length . filter ((n==) . length)
El contaje de elementos suele ser muy habitual. No existe una función estándar para ello, por lo que es habitual definir una:
count :: (a -> Bool) -> [a] -> Int
count pred = length . filter pred
conLongitud :: Int -> [String] -> Int
conLongitud n = count ((n==) . length)
Correct answer by ChemaCortes on January 13, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP