【问题标题】:How to map a two argument function to a list?如何将两个参数函数映射到列表?
【发布时间】:2013-07-17 11:45:58
【问题描述】:

我有一个包含一些值的元素列表。

我想将它映射到一个函数并生成一个列表,其中包含通过将这两个参数函数应用于第一个列表中的连续值而计算出的值。

此列表将少一个元素。

映射函数一次应该有两个参数。

编辑

示例

我使用的两个参数函数非常复杂,因此为简单起见,我们假设它是一个计算两个数字平均值的函数。

如果我有列表:[3 8 11 14 19 20 88]

我是否有可能写一个函数来映射我的average 函数,对于(average 3 8) 将给出5.5

对于(average 8 11) 将给9.5

(average 11 14) 将提供12.5

等等……

一次对列表的两个连续值应用平均值应该给我。

[5.5 9.5 12.5 16.5 19.5 54.0]

结果。

map 将单个参数函数应用于整个列表,并生成一个具有完全相同数量元素的新列表。

我想要的是一种应用我的函数的方法,它需要两个参数一次连续两个,将我的函数应用于它并将结果添加到新列表中。

【问题讨论】:

标签: clojure


【解决方案1】:

你可以用地图做到这一点:

(map f coll (rest coll))

【讨论】:

  • 这行得通!为什么 map 需要两个以上的参数?在这种情况下映射如何工作?所以它从每个传递的列表中选择一个参数?直到其中一个列表结束?
  • so it picks one argument from each list passed ? until one of the list ends ? - 是的,完全正确。传递的 fn 必须采用与传递给 map 的 seq 一样多的参数。
  • @AmoghTalpallikar 您可以在Clojure docs 中阅读更多关于map 和其他功能的信息。
【解决方案2】:
(fn [f coll] (map #(apply f %1) (partition 2 1 coll)) 

现在直接进入 4clojure!

【讨论】:

  • 太棒了!顺便说一句,#(apply f %1) 可以改为(partial apply f)
  • 或者只是#(reduce f %)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2015-04-11
  • 2021-09-30
  • 2012-09-27
  • 2020-08-14
相关资源
最近更新 更多