[英]Higher-order functions
給定
(define (reduce f id lis)
(if (null? lis) id
(f (car lis) (reduce f id (cdr lis)))))
列表的長度可以用reduce
來定義(與從頭開始使用遞歸定義相反):
(define (mylength lis) (reduce (lambda (x n) (+ 1 n)) 0 lis)).
定義列表函數mymap
(類似於map
),該列表函數使用一元函數uf
lis
來表示化lis
,即通過確定in中對應的f
和id
(mymap uf lis) = (reduce f id lis),
回想一下mymap
返回一個列表,該列表是通過在輸入列表中的每個元素上調用函數而得到的,例如(mymap (lambda(x) (* 2 x)) '(1 2 3)) = (2 4 6)
。
對如何完成此操作進行一些解釋將是有幫助的,而不是公然的答案。 謝謝。
我們有
(mymap uf lis) = (reduce f id lis) =
= (if (null? lis) id
(f (car lis) (reduce f id (cdr lis))))
必須等於
= (if null? lis) '()
(cons (uf (car lis)) (mymap uf (cdr lis))))
匹配相應的實體,我們得到
id == '()
並且,由於(mymap uf lis) = (reduce f id lis)
,所以它也是(mymap uf (cdr lis)) = (reduce f id (cdr lis))
,所以我們有
(f x y) = (cons (uf x) y)
因此,我們定義
(define (mymap uf xs) ; multiple `x`-es :)
(reduce (lambda (x r)
(cons .... r))
'()
xs ))
你的reduce
是一個正確的選擇 :它的合並函數接收參數列表xs
的元素x
,以及處理列表的其余部分的遞歸結果,如r
。
r
具有xs
其余部分的所有元素,這些元素已通過uf
映射。 所有剩下要做給定元素結合x
這個遞歸結果r
是cons
的(uf x)
在r
現在,通過寫實際代碼代替點....
來完成定義,應該沒有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.