Пример из http://www.cse.unsw.edu.au/~en1000/haskell/hof.html:Expanded форму складки в Ракетка
(foldr/7 (list 34 56 12 4 23))
(foldl/7 (list 34 56 12 4 23))
Выход в Ракетка:
5 193/196
5 193/196
Что было бы в полной мере (расширенная) форма foldl и foldr в этом случае? Не следующее:
> (/ (/ (/ (/ (/ 7 34) 56) 12) 4) 23)
1/300288
Edit: Я изменил выше вопрос, поскольку осуществление складки Ракетки против Haskell было объяснено в другом вопросе Why is foldl defined in a strange way in Racket?.
Edit: Если я правильно понял ответы ясно, расширенная форма может быть показана очень ясно с помощью модуля «потокового», где появляются заявления в порядке исполнения (_ указует выход из предыдущего оператора):
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 _))
выход в обоих случаях одинаков:
5 193/196
5 193/196
Это дает правильные ответы (которые различны для foldl и foldr) в следующем примере также:
; 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
Выход:
2
2
-2
-2
В общем языке, кажется:
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.
Возможный дубликат [Почему в Racket задан странный способ складывания?] (Http://stackoverflow.com/questions/8778492/why-is-foldl-defined-in-a-strange-way-in -racket) – uselpa
Я изменил мой вопрос выше. – rnso