Racket中的foldl1和foldr1在哪里?

时间:2014-03-24 09:40:14

标签: racket fold

球拍只有foldlfoldr,需要初始值。 Haskell另外有foldl1foldr1,它不是在初始值和第一个元素上应用函数,而是应用于第一个和第二个元素。目前我将它们实现为:

(define (foldl1 f xs)
  (foldl f (first xs) (rest xs)))

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

有一种更好的方法,只需(require srfi/1)并使用reducereduce-right。 :-D

答案 1 :(得分:1)

您所描述的内容在CL中看起来像reduce。您的过程看起来没问题,但如果列表为空则会失败。

请注意,firstrestcarcdr不同,因为它们仅适用于正确的列表。例如

(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%。