Quiero escribir una función que divide listas en sublistas según qué elementos satisfacen una propiedad determinada p
. Mi pregunta es a qué llamar la función. Daré ejemplos en Haskell, pero el mismo problema surgiría en F # o ML.¿Cómo llamar a una función que divide listas?
split :: (a -> Bool) -> [a] -> [[a]] --- split lists into list of sublists
Las sublistas, concatenados, son la lista original:
concat (split p xss) == xs
Cada sublista satisface la propiedad initial_p_only p
, es decir, (A) la lista secundaria comienza con un elemento que satisface p
— y por lo tanto es no está vacío, y (B) no hay otros elementos satisfacen p
:
initial_p_only :: (a -> Bool) -> [a] -> Bool
initial_p_only p [] = False
initial_p_only p (x:xs) = p x && all (not . p) xs
Así sea precisa al respecto,
all (initial_p_only p) (split p xss)
Si el primer elemento de la lista original no satisface p
, dividida falla.
Esta función debe llamarse diferente a split
. ¿Cómo debería llamarlo?
groupBy no parece del todo correcto. grupoPodría funcionar. –
splitBy? splitBefore/After? – Daniel
Me encanta cómo escribió una especificación formal sin una implementación. – luqui