我正在做一个减少我想要累积并返回一个向量的地方。这样做时它工作正常:
(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)
Run Code Online (Sandbox Code Playgroud)
但是,当[]参数被遗漏时,我得到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]- 红绿蓝)。
这正是我正在做的那种减少。
我不需要使用 3-arity 版本的 reduce,因为它colour-selections的大小总是至少为 2。我只是把它[]作为克服运行时错误的试验和错误的一部分。事实证明,这样做会产生很好的效果。
有什么方法可以在这里使用reduce的2-arity版本吗?
您只能使用 2-arity,reduce前提是您的缩减函数具有 (A,A) 之类的签名?A - 取两个相同类型的值并生成该类型的另一个值。
你的签名是 (A,B) ?A,其中 A 是一对[res-vec last-rgb]
,B 是三元组[r g b]。如果你想在一个 B 的序列上减少它,提供第一个 A 来开始这个序列是必要的,因为该函数不知道如何将两个 B 变成一个 A。
话虽如此,我不太认为有必要在reduce这里。假设res-vec是您减少的有趣值,它也可以通过将颜色距离映射到colour-selections1 个元素上并且本身减去 1 个元素来产生。就像是
(mapv mu/colour-distance-L2 colour-selections (drop 1 colour-selections))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |