gpt4 book ai didi

clojure - Clojure 中是否有执行相当于 `first` 的归约函数?

转载 作者:行者123 更新时间:2023-12-01 03:18:10 26 4
gpt4 key购买 nike

我经常写形式的代码

(->> init
(map ...)
(filter ...)
(first))

将其转换为使用传感器的代码时,我最终会得到类似
(transduce (comp (map ...) (filter ...)) (completing #(reduced %2)) nil init)

写作 (completing #(reduced %2))而不是 first根本不适合我。它不必要地掩盖了一项非常简单的任务。是否有更惯用的方式来执行此任务?

最佳答案

我个人将您的方法与自定义减少功能一起使用,但这里有一些替代方法:

(let [[x] (into [] (comp (map inc) (filter even?) (take 1)) [0 1])]
x)

使用破坏:/

或者:
(first (eduction (map inc) (filter even?) [0 1])

在这里您可以节省调用 comp 的费用这是为你完成的。虽然它不是 super 懒惰。它将实现多达 32 个元素,因此可能会造成浪费。
(take 1) 修复:
(first (eduction (map inc) (filter even?) (take 1) [0 1]))

与以下相比,总体而言有点短且不太清楚:
(transduce (comp (map inc) (filter even?) (take 1)) (completing #(reduced %2)) nil [0 1])

如果你需要这些,那么我可能不会创建自定义 reducer 函数,而是创建一个类似于 transduce 的函数,它需要 xform, coll作为参数并返回第一个值。它的作用更清楚,你可以给它一个很好的文档字符串。如果您想节省调用 comp 的费用您也可以使其类似于 eduction :
(defn single-xf
"Returns the first item of transducing the xforms over collection"
{:arglists '([xform* coll])}
[& xforms]
(transduce (apply comp (butlast xforms)) (completing #(reduced %2)) nil (last xforms)))

例子:
(single-xf (map inc) (filter even?) [0 1])

关于clojure - Clojure 中是否有执行相当于 `first` 的归约函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47644066/

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