TransWikia.com

Composición en Haskell

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

One Answer

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP