В Haskell, как и во многих других функциональных языках, функция foldl
определена так, что, например, foldl (-) 0 [1,2,3,4] = -10
.
Это нормально, потому что foldl (-) 0 [1, 2,3,4]
по определению ((((0 - 1) - 2) - 3) - 4)
.
Но в Racket (foldl - 0 '(1 2 3 4))
равно 2, потому что Racket "интеллектуально" вычисляет так: (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
в racket, определенном в таком нечетном (нестандартном и неинтуитивном) способе, иначе, чем на любом другом языке?