Почему в Racket странным образом определяется foldl?
В Haskell, как и во многих других функциональных языках, функцияfoldl
определяется так, что, например,foldl (-) 0 [1,2,3,4] = -10
.
Это нормально, потому чтоfoldl (-) 0 [1, 2,3,4]
по определению((((0 - 1) - 2) - 3) - 4)
.
Но в Ракетке(foldl - 0 '(1 2 3 4))
равно 2, потому что ракетка "интеллектуально" рассчитывает так:(4 - (3 - (2 - (1 - 0))))
что на самом деле 2.
Конечно, если мы определим вспомогательную функцию flip, вот так:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
тогда мы могли бы в Racket добиться того же поведения, что и в Haskell: вместо(foldl - 0 '(1 2 3 4))
мы можем написать:(foldl (flip -) 0 '(1 2 3 4))
Вопрос в том, почемуfoldl
в ракетке, определенной таким странным (нестандартным и не интуитивным) образом, иначе, чем в любом другом языке?