En Haskell, como en muchos otros lenguajes funcionales, la función foldl
se define de manera que, por ejemplo, foldl (-) 0 [1,2,3,4] = -10
.¿Por qué se define foldl de forma extraña en Racket?
Esto está bien, porque foldl (-) 0 [1, 2,3,4]
es, por definición, ((((0 - 1) - 2) - 3) - 4)
.
Pero, en la raqueta, (foldl - 0 '(1 2 3 4))
es 2, porque la raqueta "inteligente" calcula así: (4 - (3 - (2 - (1 - 0))))
, que de hecho es 2.
Por supuesto, si definimos flip función auxiliar, así:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
entonces podríamos raqueta en lograr el mismo comportamiento que en Haskell: en lugar de (foldl - 0 '(1 2 3 4))
podemos escribir: (foldl (flip -) 0 '(1 2 3 4))
la pregunta es: ¿por qué es foldl
en la raqueta definido de una manera tan extraña (no estándar y no intuitiva), de manera diferente que en cualquier otro idioma?
FWIW, el 'fold-left' de Chez Scheme es consistente con lo que estás esperando:' (fold-left - 0 '(1 2 3 4)) 'is' -10' y '(fold-left cons'() ' (1 2 3 4)) 'is' ((((()) 1). 2). 3). 4) '. – erjiang