在 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
在球拍中以如此奇怪(非标准和非直观)的方式定义,与任何其他语言不同?