Izquierdo-Interno y Externo (Haskell)
No entiendo bien la reducción en Haskell en esta función:
removeone :: Eq a => a -> [a] -> [a]
removeone _ [] = []
removeone x (y:ys)
| x == y = removeone x ys
| otherwise = y : (removeone x ys)
remdups :: Eq a => [a] -> [a]
remdups [] = []
remdups (x:xs) = x : remdups (removeone x xs)
¿Cómo puedo utilizar esta función para explicar los pasos de reducción en una lista (por ejemplo, remdups [3,7,3,7,5,7]
)?
davy.ai
Para entender los pasos de reducción en la función
remdups
, primero hay que entender cómo funciona la funciónremoveone
.La función
removeone
toma como input un elementox
y una lista[a]
de elementos. Elimina recursivamente la primera ocurrencia dex
en la lista y devuelve la lista modificada. Si la lista está vacía, devuelve una lista vacía.Ahora, veamos la función
remdups
, que toma como input una lista[a]
de elementos. La función elimina recursivamente los duplicados de la lista y devuelve la lista modificada. Si la lista de entrada está vacía, devuelve una lista vacía.Para entender los pasos de reducción en la llamada a la función
remdups [3,7,3,7,5,7]
, podemos desglosarla en los siguientes pasos:remdups [3,7,3,7,5,7]
– la lista de entrada no está vacía, por lo que pasamos al siguiente paso.3 : remdups (removeone 3 [7,3,7,5,7])
– el primer elemento de la lista de entrada es3
, por lo que lo agregamos a la lista de salida. Llamamos ahora a la funciónremdups
en la lista modificada[7,3,7,5,7]
obtenida al eliminar la primera ocurrencia de3
en[3,7,3,7,5,7]
mediante la funciónremoveone
.3 : 7 : remdups (removeone 7 [3,7,5,7])
– el primer elemento de la lista modificada es7
, por lo que lo agregamos a la lista de salida. Llamamos ahora a la funciónremdups
en la lista modificada[3,7,5,7]
obtenida al eliminar la primera ocurrencia de7
en[7,3,7,5,7]
mediante la funciónremoveone
.3 : 7 : 3 : remdups (removeone 3 [7,5,7])
– el primer elemento de la lista modificada es3
, pero es un duplicado, por lo que lo omitimos. Llamamos ahora a la funciónremdups
en la lista modificada[7,5,7]
obtenida al eliminar la primera ocurrencia de3
en[3,7,5,7]
mediante la funciónremoveone
.3 : 7 : 3 : 5 : remdups (removeone 5 [7,7])
– el primer elemento de la lista modificada es5
, por lo que lo agregamos a la lista de salida. Llamamos ahora a la funciónremdups
en la lista modificada[7,7]
obtenida al eliminar la primera ocurrencia de5
en[7,5,7]
mediante la funciónremoveone
.3 : 7 : 3 : 5 : 7 : remdups (removeone 7 [])
– el primer elemento de la lista modificada es7
, pero es un duplicado, por lo que lo omitimos. Llamamos ahora a la funciónremdups
en la lista modificada[]
obtenida al eliminar la primera ocurrencia de7
en[7,7]
mediante la funciónremoveone
.3 : 7 : 3 : 5 : 7 : []
– la lista de entrada está vacía, por lo que detenemos la función.Esto muestra cómo la función
remdups
utiliza la funciónremoveone
para eliminar elementos duplicados de una lista de forma recursiva. Los pasos de reducción muestran cómo la función se llama a sí misma varias veces con listas de entrada modificadas hasta que alcanza el caso base (una lista vacía) y devuelve la lista de salida final.