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