![](/img/trans.png)
[英]Abstract List Functions in Racket/Scheme - Num of element occurrences in list
[英]Applying list of functions to list of values in Racket
我一般對球拍和方案語言都不熟悉,很難實現自己的想法。
基本上,我有一個函數列表(將其稱為List f
)和一個字符串列表(將其稱為List s
)。 我需要為f中的每個函數執行該函數,並將值存儲在另一個列表中(讓調用為List done
)。
例如:說我有List A = (f1 f2)
和List B = (abc)
,我將執行:
f1 a
f1 b
f1 c
f2 a
f2 b
f2 c
他們都會將其值附加到List done
我也不能使用任何形式的set
球拍。
我了解這是如何工作的,並且可以輕松地用C或Java編寫此代碼,但是方案給我帶來了麻煩。
在Racket中,有許多內置過程可輕松解決涉及操作列表的問題。 對於您的示例,您正在尋找for*/list
:
(define A (list string-upcase string-downcase))
(define B (list "Aa" "Bb" "Cc"))
(define done
(for*/list ([f A] [s B])
(f s)))
遍歷A
所有元素,依次將每個元素分配給變量f
。 並且在嵌套循環中,它還會遍歷B
所有元素,依次將每個元素分配給變量s
。 在循環的主體中,它將每個f
應用於所有s
,並將所有內容收集在輸出列表中。 現在done
包含預期值:
done
=> '("AA" "BB" "CC" "aa" "bb" "cc")
如果我們要使用遞歸手動完成此操作,則將需要更多工作。 可能的實現方式是使一個過程執行“外部”循環,這將調用另一個過程進行“內部”循環。 第三個過程將啟動遞歸並合並結果:
(define (outer-loop funcs params)
(if (null? funcs)
'()
(cons (inner-loop (car funcs) params)
(outer-loop (cdr funcs) params))))
(define (inner-loop f params)
(if (null? params)
'()
(cons (f (car params))
(inner-loop f (cdr params)))))
(define (apply-funcs funcs params)
(apply append ; required to "flatten" the list of lists
(outer-loop funcs params)))
我們將像這樣使用它:
(define done (apply-funcs A B))
首先,您應該學習如何手工解決列表問題,實現自己的循環。 一旦確信自己了解自己在做什么,就花一些時間來學習現有的列表過程以及迭代和理解 ,這是在現實生活中使用該語言的慣用方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.