1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Haskell] duvida numa funçao

Discussão em 'Programação' iniciada por Neo4, 28 de Janeiro de 2008. (Respostas: 1; Visualizações: 1120)

  1. Neo4

    Neo4 Banido

    Bem eu ando a tentar fazer a função words que ja vem definida no prelude, para tal estou a criar uma funcao auxiliar que divide uma string apenas em 2 se encontrar um espaço:

    Código:
    parte :: String -> (String, String)
    parte [] = ([],[])
    parte (a:as) | isSpace a == True = ([],as)
                 | otherwise = (a: x,y)
                               where (x,y) = parte as
    
    ela funciona
    o que eu não percebo é porque é que se em vez do x,y pusermos o parte as a funcao nao funciona!
    alguem me pode exclarecer?

    Obrigado
     
  2. Baderous

    Baderous Banido

    Experimenta fazer iteração por iteração e vais ver que há diferenças. Se usares o parte as como queres fazer, aquilo vai-te criar uma lista de chars e não um par de strings.
    Se usares da forma correcta, ele vai percorrer a string até ao espaço e depois volta para trás para construir o par de strings. Isso executa assim:
    Por ex, para a string "cao meu":

    ('c':('a':('o':([],"meu")))

    Isto é o que obtens quando ele atinge o espaço. Depois, ele volta do fim para o princípio, construindo os pares da seguinte forma:

    ('c':('a':('o':([],"meu"))) -> ('c':('a':('o':[],"meu"))) -> ('c':('a':'o':[],"meu")) -> ('c':'a':'o':[],"meu") -> ("cao","meu")

    Obtendo assim o resultado pretendido. É o chamado lazy evaluation do Haskell.
     
    Última edição: 28 de Janeiro de 2008

Partilhar esta Página