El primero al final
Definir la función
1 |
rota1 :: [a] -> [a] |
tal que (rota1 xs)
es la lista obtenida poniendo el primer elemento de xs
al final de la lista. Por ejemplo,
1 |
rota1 [3,2,5,7] == [2,5,7,3] |
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 25 26 27 |
import Test.QuickCheck -- 1ª solución -- =========== rota1a :: [a] -> [a] rota1a [] = [] rota1a xs = tail xs ++ [head xs] -- 2ª solución -- =========== rota1b :: [a] -> [a] rota1b [] = [] rota1b (x:xs) = xs ++ [x] -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_rota1 :: [Int] -> Bool prop_rota1 xs = rota1a xs == rota1b xs -- La comprobación es -- λ> quickCheck prop_rota1 -- +++ OK, passed 100 tests. |
El código se encuentra en GitHub.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
from typing import TypeVar from hypothesis import given, strategies as st A = TypeVar('A') # 1ª solución def rota1a(xs: list[A]) -> list[A]: if xs == []: return [] return xs[1:] + [xs[0]] # 2ª solución def rota1b(xs: list[A]) -> list[A]: if xs == []: return [] ys = xs[1:] ys.append(xs[0]) return ys # 3ª solución def rota1c(xs: list[A]) -> list[A]: if xs == []: return [] y, *ys = xs return ys + [y] # La equivalencia de las definiciones es @given(st.lists(st.integers())) def test_rota1(xs: list[int]) -> None: assert rota1a(xs) == rota1b(xs) == rota1c(xs) # La comprobación es # src> poetry run pytest -q el_primero_al_final.py # 1 passed in 0.20s |
El código se encuentra en GitHub.
Comentarios
- El primer elemento de la lista
xs
se calcula- en Haskell, con
head xs
- en Python, con
xs[0]
- en Haskell, con
- El resto de la lista
xs
se calcula- en Haskell, con
tail xs
- en Python, con
xs[1:]
- en Haskell, con
- La concatenación de las listas
xs
eys
se calcula- en Haskell, con
xs ++ ys
- en Python, con
xs + ys
- en Haskell, con
- En Python.
xs.append(x)
modifica la listaxs
añadiéndolex
al final. Por ejemplo,
1 2 3 4 |
>>> xs = [3, 2, 5] >>> xs.append(1) >>> xs [3, 2, 5, 1] |