Functional programming 球拍:列表参考功能

Functional programming 球拍:列表参考功能,functional-programming,scheme,lisp,racket,fold,Functional Programming,Scheme,Lisp,Racket,Fold,我想知道是否可以使用racket中的内置函数foldl和foldr编写一个list ref函数。基本上,我如何使用fold和foldr更改这段代码: (定义(我的列表参考lst n) (如果(零?n) (第一层) (列表参考(rest lst)(-n1))这里有一种可能的方法。诀窍是作为累加器传递一个包含两个值的列表:第一个值是一个标志,告诉您是否找到了元素,第二个值跟踪当前索引,该索引随着每次迭代而递增。该标志是必需的,因为我们需要一种方式来表示:停止寻找索引,我们已经找到了它。无论如何,fo

我想知道是否可以使用racket中的内置函数foldl和foldr编写一个list ref函数。基本上,我如何使用fold和foldr更改这段代码:

(定义(我的列表参考lst n) (如果(零?n) (第一层)
(列表参考(rest lst)(-n1))

这里有一种可能的方法。诀窍是作为累加器传递一个包含两个值的列表:第一个值是一个标志,告诉您是否找到了元素,第二个值跟踪当前索引,该索引随着每次迭代而递增。该标志是必需的,因为我们需要一种方式来表示:停止寻找索引,我们已经找到了它。无论如何,
foldl
必须使用整个输入列表,因为它就是这样工作的

(define (my-list-ref lst n)
  (let ((result
         (foldl (lambda (ele acc)
                  (cond ((first acc) acc)
                        ((= n (second acc)) (list #t ele))
                        (else (list #f (add1 (second acc))))))
                (list #f 0)
                lst)))
    (if (first result)
        (second result)
        (error "index out of bounds"))))
一些测试:

(my-list-ref '(a b c) 0)
=> 'a
(my-list-ref '(a b c) 1)
=> 'b
(my-list-ref '(a b c) 2)
=> 'c

(my-list-ref '() 0)
=> index out of bounds
(my-list-ref '(a b c) -1)
=> index out of bounds
(my-list-ref '(a b c) 3)
=> index out of bounds
使用“折叠”很容易。但我们只需要将“cond”与“local”一起使用。