【问题标题】:Clojure : Get the values from each vector of vectors and pass that as an argument to the other functionClojure:从每个向量向量中获取值并将其作为参数传递给另一个函数
【发布时间】:2018-10-22 22:07:18
【问题描述】:

我想从向量的向量中获取值,并将该值作为参数传递给另一个函数。我想在向量的向量集合中调用其他函数。

例如:

这是演示代码,将解释我正在尝试的内容

    (defn demo
            [arg1 arg2 arg3 arg4 arg5]
            (println "====== in Demo=======")
            (println arg1 arg2 arg3 arg4 arg5)
    )

    (def vv [["item1" "item2" "item3" 4] ["item5" "item6" "item7" 80.0] .....])

我想要一个可以遍历 vv 并获取每个 v 的值并将其作为参数传递给 demo

的函数
    (def somefun 
    iterate [i vv] demo (get v 0) (get v 1) (get v 2) (get v 3)) 

;;这应该对 vv 中的所有向量重复

【问题讨论】:

  • 尝试对问题进行框架化,以便函数的工作以它们的返回值来表达,这可以根据您的喜好来复杂。不要打印结果 - 退回它们。然后你会发现 Clojure 有很多高阶函数,可以从向量的向量中表达你想要的大部分东西。
  • 谢谢@Thumbnail 我在上面的声明中使用了 println,只是为了理解。我想以自己的方式使用这些论点。
  • (doseq [v vv] (apply demo v)) 假设 demo 预期的参数数量与 v 的长度相同,但在您的示例向量中并非如此。
  • @jas 非常感谢!它在传递参数时确实有效,但我想 doseq 存在一个问题。它不返回任何东西对吗?假设我从 Demo 函数中获得了一些价值。那么我可以在这里评估为(and (doseq [v vv] (apply demo v)) 例如:假设演示函数发送一组参数 true,接下来它发送给我 false 等等。 .. 所以在这里我会得到(and (true false true true false .... .. .. )) doseq 将始终返回 nill
  • @jas 嘿,我想我可以使用 for 而不是 doseq 和 apply,它还会返回从 接收到的值演示函数; (for [v vv] apply demo v)

标签: vector clojure


【解决方案1】:

由于函数式语言中的迭代通常意味着map,我会这样做:

(defn somefun [vv]
    (map (partial apply demo) vv)

地图遍历所有向量。 partial 函数将每个 v 附加到映射函数。最后,您为vv 中的每个v 调用(apply demo v)

apply 接受向量并将其元素转换为demo 的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2012-03-03
    • 1970-01-01
    • 2015-09-28
    • 2012-01-15
    • 1970-01-01
    • 2013-02-22
    • 2023-03-31
    相关资源
    最近更新 更多