簡體   English   中英

將功能列表應用於球拍中的值列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM