Почему foldl определена странным образом в Racket?

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

44
задан Óscar López 8 January 2012 в 16:20
поделиться