gpt4 book ai didi

Clojure 映射-最长

转载 作者:行者123 更新时间:2023-12-02 17:50:42 30 4
gpt4 key购买 nike

我正在尝试编写一个名为 map-longest 的 Clojure 实用函数(感谢备用名称建议)。该函数将具有以下“签名”:

(map-longest fun missing-value-seq c1 & colls)

其行为与map类似,但它将继续处理提供的集合,直到最长耗尽。对于比最长的集合短的集合,当它用完值时,它将从 missing-values-seq 中获取它们。它应该是惰性的,但显然不能用于无限集合。

使用示例:

(print (apply str
(map-longest #(str %1 \space %2 \space %3 \newline) (repeatedly "--")
["a1" "a2" "a3"] ["b1" "b2"] ["c1" "c2" "c3" "c4"])))

应该产生以下输出:

a1 b1 c1
a2 b2 c2
a3 -- c3
-- -- c4

但我可能打错了电话。

我该如何实现这个? clojure.core 或 clojure-contrib 库是否已经有类似的东西?作为 missing-value-seq 的替代方案,最好传入第二个函数来生成缺失值(例如:#(identity "--")在我的例子中)?

用例:我正在编写一个小型文本蜘蛛纸牌播放器,作为学习 Clojure/函数式编程的练习。我需要能够显示游戏画面(纯粹主义者的画面:-))。

最佳答案

这是一个解决方案:

(defn map-longest
([fn missing-value-fn c1]
(map fn c1))
([fn missing-value-fn c1 & colls]
(lazy-seq
(when (not-every? empty? (conj colls c1))
(let [firsts (map first (conj colls c1))]
(cons
(apply fn (map #(if (nil? %) (missing-value-fn) %) firsts))
(apply map-longest
(conj (map rest colls) (rest c1) missing-value-fn fn))))))))

测试:

user=> (print (apply str 
(map-longest #(str %1 \space %2 \space %3 \newline) #(identity "--")
["a1" "a2" "a3"] ["b1" "b2"] ["c1" "c2" "c3" "c4"])))
a1 b1 c1
a2 b2 c2
a3 -- c3
-- -- c4
nil

请注意,我采用了 missing-value-fn 方法,而不是 missing-value-seq 方法。

更新

更新了代码以处理 ffriend 在评论中提到的情况。

测试:

user=> (print (apply str
(map-longest #(str %1 \space %2 \space %3 \newline) #(identity "--")
["a1" "a2" nil] ["b1" "b2"] ["c1" "c2" nil "c4"])))
a1 b1 c1
a2 b2 c2
-- -- --
-- -- c4
nil

请注意,这会将 coll 中的 nil 替换为 missing-value-fn 返回的值。

关于Clojure 映射-最长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4460986/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com