Clojure reduce需要val参数来累积向量

时间:2015-09-05 10:43:00

标签: clojure

我正在进行减少,我想积累并返回一个向量。这样做完成后效果很好:

(reduce
  (fn [[res-vec last-rgb] rgb]
    (let [calc-res (mu/colour-distance-L2 last-rgb rgb)
          accum-results (conj res-vec calc-res)]
      [accum-results rgb]))
  []
  colour-selections)

但是当遗漏[]参数时,我得到Caused by: java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long。出现这种情况是因为colour-distance-L2至少有一个java.lang.Long而不是两个向量,因为它预期(类型 [r g b]的两个向量 - 红绿色和蓝色)。

This正是我正在做的那种减少。

我不需要使用3-arity版本的reduce,因为colour-selections的大小总是至少为2.我只是将[]作为试用版的一部分和错误超过运行时错误。事实证明这样做会产生很好的效果。

有什么方法可以在这里使用2-arity版本的reduce?

1 个答案:

答案 0 :(得分:4)

您只能使用2-arity class APIController < ApplicationController before_action :check_headers private def check_header # do whatever is required here end end ,前提是您的缩小功能具有类似(A,A)→A的签名 - 取两个相同类型的值并生成该类型的另一个值。
你的签名为(A,B)→A,其中A是一对reduce
和B是三[res-vec last-rgb]。如果你想在B序列上减少它,提供第一个A开始序列是必要的,因为该函数不知道如何将两个B变为A。

话虽这么说,我在这里看不到[r g b]的需要。假设reduce是您减少的有趣值,它也可以通过将颜色距离映射到res-vec以及本身减去1个元素来生成。像

这样的东西
colour-selections