球拍只有foldl
和foldr
,需要初始值。 Haskell另外有foldl1
和foldr1
,它不是在初始值和第一个元素上应用函数,而是应用于第一个和第二个元素。目前我将它们实现为:
(define (foldl1 f xs)
(foldl f (first xs) (rest xs)))
有更好的方法吗?
答案 0 :(得分:2)
有一种更好的方法,只需(require srfi/1)
并使用reduce
和reduce-right
。 :-D
答案 1 :(得分:1)
您所描述的内容在CL中看起来像reduce
。您的过程看起来没问题,但如果列表为空则会失败。
请注意,first
和rest
与car
和cdr
不同,因为它们仅适用于正确的列表。例如
(first '(a b c d e . f))
;;==>
;;first: contract violation
;; expected: (and/c list? (not/c empty?))
;; given: '(a b c d e . f)
现在。对于球拍在这里发出信号,它必须遍历整个列表以确保它以null结束,因为它没有发出错误信号。我做了一个小测试,发现排序200万个列表的时间比first
/ rest
多32%。