0votos

cola de los números tramposos en Haskell

por josejuan hace 5 años

Aunque el enunciado no lo indica, se asume que el centinela (el amigo que cuela al listo) puede no estar en la cola y que un elemento aparece como mucho una vez en la cola y, de lo contrario, sólo se cuela una vez (la primera por la cabeza).

sta es una cola donde se vale colarse. Escribe un programa que implemente el método Colar(AntesDe, el).

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
35
36
37
38
39
-- Una forma habitual de escribirlo podría ser: 
colar [] _ l = [l] 
colar (x:xs) a l = if x == a 
                     then l:a:xs 
                     else x:colar xs a l 
 
 
 
-- Una forma extremadamente detallada de escribir lo anterior podría ser: 
colar ::                        -- `colar` es una función 
         Eq a =>                -- en que, siendo `a` comparable en igualdad, 
          [a] ->                -- toma una lista de `a`es (la cola inicial), 
           a  ->                -- toma un elemento `a` (el amigo que cuela) 
           a  ->                -- toma otro elemento `a` (a quien cuelan) 
          [a]                   -- y devuelve la lista actualizada (la cola final) 
 
colar []                        -- Si la cola está vacía 
      _                         -- nos da igual el amigo que sea 
      l                         -- porque al que cuelan (el listo) 
        = [l]                   -- estará sólo en la lista 
 
colar (x:xs)                    -- Si la cola no está vacía, sea `x` el primero y `xs` los demás 
      a                         -- sea `a` el amigo que cuela 
      l                         -- sea `l` el listo al que cuelan 
       =                        -- entonces 
    if x == a                   -- si ese primer elemento es el `a`migo 
        then l:a:xs             -- la cola final será el `l`isto, el `a`migo y los tontos de detrás 
        else x:colar xs a l     -- sino, `x` no se deja colar y seguirá el primero, y de los demás, 
                                -- volvemos a mirar dónde podemos colar al `l`isto. 
 
 
 
-- Una forma enrevesada de poner la firma para que los nombres de los tipos sean descriptivos 
-- podría ser: 
 
{-# LANGUAGE GADTs #-} 
 
colar :: (Eq persona, amigo ~ persona, listo ~ persona) => 
         [persona] -> amigo -> listo -> [persona] 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.