Elementos consecutivos relacionados
Definir la función
relacionados :: (a -> a -> Bool) -> [a] -> Bool
tal que relacionados r xs
se verifica si para todo par (x,y)
de elementos consecutivos de xs
se cumple la relación r
. Por ejemplo,
relacionados (<) [2,3,7,9] == True relacionados (<) [2,3,1,9] == False
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
-- 1ª solución -- =========== relacionados1 :: (a -> a -> Bool) -> [a] -> Bool relacionados1 r xs = and [r x y | (x,y) <- zip xs (tail xs)] -- 2ª solución -- =========== relacionados2 :: (a -> a -> Bool) -> [a] -> Bool relacionados2 r (x:y:zs) = r x y && relacionados2 r (y:zs) relacionados2 _ _ = True -- 3ª solución -- =========== relacionados3 :: (a -> a -> Bool) -> [a] -> Bool relacionados3 r xs = and (zipWith r xs (tail xs)) -- 4ª solución -- =========== relacionados4 :: (a -> a -> Bool) -> [a] -> Bool relacionados4 r xs = all (uncurry r) (zip xs (tail xs))
Soluciones en Python
from typing import Callable, TypeVar A = TypeVar('A') # 1ª solución # =========== def relacionados1(r: Callable[[A, A], bool], xs: list[A]) -> bool: return all((r(x, y) for (x, y) in zip(xs, xs[1:]))) # 2ª solución # =========== def relacionados2(r: Callable[[A, A], bool], xs: list[A]) -> bool: if len(xs) >= 2: return r(xs[0], xs[1]) and relacionados1(r, xs[1:]) return True