View Full Version : [Haskell] duvida numa funçao


Neo4
28-01-2008, 18:30
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:


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

Baderous
28-01-2008, 18:59
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.