为什么';clojure核心库是否支持函数索引?

为什么';clojure核心库是否支持函数索引?,clojure,clojure-java-interop,Clojure,Clojure Java Interop,最近,我开始学习clojure编程和函数式编程。我注意到,在解决一些基本的编程难题时,没有向量的函数索引,例如核心函数nth没有反转。我见过人们自己实现它,或者使用一些java替代实现 我的问题不在于是否有解决办法(但如果你知道一个特别优雅的解决办法,请分享),因为我知道有。我想知道的是:为什么会出现这种情况,例如,为什么clojure开发人员决定不实现看起来如此基本的操作。在向量中进行位置查找在clojure中是否有点不习惯,理想情况下是否可以用其他方式进行?如何回答?以相反的顺序回答这两个问

最近,我开始学习clojure编程和函数式编程。我注意到,在解决一些基本的编程难题时,没有向量的函数索引,例如核心函数
nth
没有反转。我见过人们自己实现它,或者使用一些java替代实现


我的问题不在于是否有解决办法(但如果你知道一个特别优雅的解决办法,请分享),因为我知道有。我想知道的是:为什么会出现这种情况,例如,为什么clojure开发人员决定不实现看起来如此基本的操作。在向量中进行位置查找在clojure中是否有点不习惯,理想情况下是否可以用其他方式进行?如何回答?

以相反的顺序回答这两个问题:

“变通方法”:clojure中的
向量实现了
java.util.List
,因此java工作简单(在我看来足够优雅)

此外,字符串可以利用
clojure.string/index of


为什么不在clojure.core中:这相当于一个问题“为什么不同集合类型没有[多态fn]”,答案如下:这里

以相反的顺序回答这两个问题:

“变通方法”:clojure中的
向量实现了
java.util.List
,因此java工作简单(在我看来足够优雅)

此外,字符串可以利用
clojure.string/index of

为什么不在clojure.core中:这相当于一个问题“为什么各种集合类型都没有[多态fn]”,这里回答了这个问题:这里有一个标准clojure函数,几乎可以满足问题的需要

如果我们看,我们需要做的是反转一个序列,比如

(def ranks [2 3 4 5 6 7 8 9 10 :jack :queen :king :ace])
。。。进入一个映射(或其他函数),该映射为我们提供每个值的索引:

我们可以一劳永逸地做到这一点

几乎可以做到这一点的标准函数是

  • 但它适用于地图,而不是序列
  • 但它将它们视为成对的序列
所以,将向量(或其他序列)转化为索引函数的简单函数是

(defn indexes-of [v]
  (->> v
       (map-indexed vector)
       (clojure.set/map-invert)))
比如说,

   (indexes-of ranks)
=> {7 5, :king 11, 4 2, :queen 10, :ace 12, 6 4, 3 1, 2 0, :jack 9, 9 7, 5 3, 10 8, 8 6}
所以那些说你找错了方向的人是对的。 然而,在Clojure本身中执行这样的无域计算肯定会更好,不管Clojure如何顺利地与运行它的任何VM对接

我们需要的是一个覆盖向量的斗篷,使其成为地图:就像覆盖向量的斗篷一样,使其显示为相反的序列。然后,我们不需要假设
map invert
将接受一系列对。(为了安全起见,我们可以将成对的序列
馈送到一个映射中,以馈送到
映射反转

有一个标准的Clojure函数,几乎可以满足问题的需要

如果我们看,我们需要做的是反转一个序列,比如

(def ranks [2 3 4 5 6 7 8 9 10 :jack :queen :king :ace])
。。。进入一个映射(或其他函数),该映射为我们提供每个值的索引:

我们可以一劳永逸地做到这一点

几乎可以做到这一点的标准函数是

  • 但它适用于地图,而不是序列
  • 但它将它们视为成对的序列
所以,将向量(或其他序列)转化为索引函数的简单函数是

(defn indexes-of [v]
  (->> v
       (map-indexed vector)
       (clojure.set/map-invert)))
比如说,

   (indexes-of ranks)
=> {7 5, :king 11, 4 2, :queen 10, :ace 12, 6 4, 3 1, 2 0, :jack 9, 9 7, 5 3, 10 8, 8 6}
所以那些说你找错了方向的人是对的。 然而,在Clojure本身中执行这样的无域计算肯定会更好,不管Clojure如何顺利地与运行它的任何VM对接


我们需要的是一个覆盖向量的斗篷,使其成为地图:就像覆盖向量的斗篷一样,使其显示为相反的序列。然后,我们不需要假设
map invert
将接受一系列对。(为了安全起见,我们可以将成对的序列
馈送到一个映射中,以馈送到
映射反转

在使用Clojure 2年多的时间里,我从未需要过这样的功能。您需要它的用例示例是什么?我敢打赌你只是用非惯用的方式来处理这个问题。唯一具有良好索引访问能力的容器是向量。通常你不想在列表上做线性搜索,只要找到一个索引(如果可能的话)。目前我正在解决的问题是:如果上面描述的函数存在,我只需要比较两张卡片的索引,然后选择更大的一张。这样,我不确定“惯用”方法是什么。我知道.indexOf,但我想用clojurish的方式来解决这个问题。我认为在不太clojurish(面向数据)中“我需要一个与其他数据分开的索引”的思想,例如,看看这里索引是哈希值的情况:此外,列表的indexOf每次都是线性复杂的,但是构建一个hashmap并查询一次,它在时间上更稳定;)谢谢好东西。在使用Clojure 2年多的时间里,我从未需要过这样的功能。您需要它的用例示例是什么?我敢打赌你只是用非惯用的方式来处理这个问题。唯一具有良好索引访问能力的容器是向量。通常你不想在列表上做线性搜索,只要找到一个索引(如果可能的话)。目前我正在解决的问题是:如果上面描述的函数存在,我只需要比较两张卡片的索引,然后选择更大的一张。这样,我不确定“惯用”方法是什么。我知道.indexOf,但我想用clojurish的方式来解决这个问题。我认为在不太clojurish(面向数据)中“我需要一个与其他数据分开的索引”的思想,例如,看看这里索引是哈希值的情况:此外,列表的indexOf每次都是线性复杂的,但是构建一个hashmap并查询一次,它在时间上更稳定;)Th