• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

casdio

Função fold

4 mensagens neste tópico

length1::[int]->Int
length1 l = foldl (\x y->1+x) 0 l

Alguem me consegue explicar como funciona esta função?

A map e a filter ja percebi, agora a fold e que nao :|

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E como é que funciona neste caso do length?

Isso e que nao tou a perceber :|

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nem tinha reparado que isso está definido com um foldl em vez de um foldr. O resultado final é o mesmo, os resultados parciais é que são diferentes, pois o foldl faz associatividade à esquerda. Enquanto que o foldr está mais próximo do padrão de definição de funções recursivas com primitividade recursiva, o foldl está mais próximo do padrão de definição de funções recursivas com acumuladores, como podes verificar pelo seu tipo:

foldl :: (a -> b -> a) -> a -> [b] -> a

Como podes ver, para cada elemento do tipo 'b' da lista parâmetro, a função foldl executa a função que toma como 1º parâmetro, fazendo algo com o tal elemento 'b' e o acumulador do tipo 'a', cujo valor inicial é dado pelo 2º parâmetro do foldl, resultando em sucessivos resultados "acumulados" sobre esse acumulador.

Então, para a lista [1,2,3], essa função desenvolve-se da seguinte maneira:

length [1,2,3]
= foldl (\x y -> 1+x) 0 [1,2,3]
= 1+(foldl (\x y -> 1+x) 0 [2,3])
= 1+(1+(foldl (\x y -> 1+x) 0 [3])
= 1+(1+(1+(foldl (\x y -> 1+x) 0 [])
= (1+(1+(1+0))) = 3

Espero não ter dito nenhuma asneira relativamente a esta demonstração.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora