Forma expandida de dobra na raquete
Exemplo dehttp://www.cse.unsw.edu.au/~en1000/haskell/hof.html :
(foldr / 7 (list 34 56 12 4 23))
(foldl / 7 (list 34 56 12 4 23))
Saída na raquete:
5 193/196
5 193/196
Qual seria a forma completa (expandida) de foldl e foldr nesse caso? Não é o seguinte:
> (/ (/ (/ (/ (/ 7 34) 56) 12) 4) 23)
1/300288
Edit: Eu modifiquei a pergunta acima desde a implementação da dobra no Racket vs Haskell foi explicada em outra perguntaPor que foldl é definido de uma maneira estranha no Racket?.
Editar: Se eu entender as respostas claramente, o formulário expandido pode ser mostrado com muita clareza usando o módulo "threading", onde as instruções aparecem em ordem de execução (_ indica a saída da instrução anterior):
foldl:
(require threading)
; expanded form of (foldl / 7 (list 34 56 12 4 23))
; FROM LEFT TO RIGHT:
(~> 7
(/ 34 _)
(/ 56 _)
(/ 12 _)
(/ 4 _)
(/ 23 _) )
foldr:
; expanded form of (foldr / 7 (list 34 56 12 4 23))
; FROM RIGHT TO LEFT:
(~> 7
(/ 23 _)
(/ 4 _)
(/ 12 _)
(/ 56 _)
(/ 34 _) )
A saída nos dois casos é a mesma:
5 193/196
5 193/196
Fornece respostas corretas (que são diferentes para foldl e foldr) no exemplo a seguir também:
; FROM LEFT TO RIGHT:
(foldl - 0 '(1 2 3 4))
(~> 0
(- 1 _) ; 1-0=1
(- 2 _) ; 2-1=1
(- 3 _) ; 3-1=2
(- 4 _)) ; 4-2=2
; FROM RIGHT TO LEFT:
(foldr - 0 '(1 2 3 4))
(~> 0
(- 4 _) ; 4-0=4
(- 3 _) ; 3-4=-1
(- 2 _) ; 2-(-1)=3
(- 1 _)) ; 1-3=-2
Resultado:
2
2
-2
-2
Em linguagem comum, parece:
The sent function takes 2 arguments,
the first argument is from the list, one after the other
(left to right or right to left depending on foldl and foldr),
the second argument is init first and
then the output of previous calculation.