Racket 其中';球拍里有折叠1和折叠1吗?
球拍只有和,这需要初始值。Haskell还有and,它不是对初始值和第一个元素应用函数,而是应用于第一个和第二个元素。目前,我将其实现为:Racket 其中';球拍里有折叠1和折叠1吗?,racket,fold,Racket,Fold,球拍只有和,这需要初始值。Haskell还有and,它不是对初始值和第一个元素应用函数,而是应用于第一个和第二个元素。目前,我将其实现为: (define (foldl1 f xs) (foldl f (first xs) (rest xs))) 有更好的方法吗?您所描述的内容看起来像CL中的reduce。您的过程看起来正常,但如果列表为空则会失败 请注意,first和rest与car和cdr不同,因为它们只适用于正确的列表。例如 (first '(a b c d e . f)) ;;==
(define (foldl1 f xs)
(foldl f (first xs) (rest xs)))
有更好的方法吗?您所描述的内容看起来像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)
现在。为了让racket在这里发出信号,它必须遍历整个列表,以确保它以null结尾,因为它没有发出错误信号。我做了一个小测试,发现使用
first
/rest
对200万个列表进行排序比使用(需要srfi/1)
和reduce right
要多花32%的时间:-不,我不知道更好的办法。顺便说一下,虽然你可能已经知道这一点。