Elementos consecutivos relacionados
Definir la función
| 1 |    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,
| 1 2 |    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.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | -- 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)) | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |