Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket 其中';球拍里有折叠1和折叠1吗?_Racket_Fold - Fatal编程技术网

Racket 其中';球拍里有折叠1和折叠1吗?

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)) ;;==

球拍只有和,这需要初始值。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))
;;==> 
;;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%的时间:-不,我不知道更好的办法。顺便说一下,虽然你可能已经知道这一点。