В 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 определяется таким странным (нестандартным и неинтуитивным) способом, иначе, чем на любом другом языке?