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
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.