【发布时间】:2012-02-05 09:38:37
【问题描述】:
在 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 以如此奇怪(非标准和不直观)的方式定义,与任何其他语言不同?
【问题讨论】:
-
FWIW,Chez Scheme 的
fold-left与您的预期一致:(fold-left - 0 '(1 2 3 4))是-10和(fold-left cons '() '(1 2 3 4))是((((() . 1) . 2) . 3) . 4)。
标签: recursion functional-programming scheme racket fold