首页 > 解决方案 > Clojure 中的迭代函数参数

问题描述

我在迭代传递给以下函数的函数参数时遇到问题。

(defn iterateDates
  [& dates]
  (let [ukFormatter (java.time.format.DateTimeFormatter/ofPattern "dd-MM-yyyy")]
    (for [i [dates]]
      (java.time.LocalDate/parse i ukFormatter))))

(iterateDates "09-10-2019" "10-10-2019" "11-10-2019")

然而,当调用它时,会返回以下错误:

Error printing return value (ClassCastException) at clojure.core/getOldestDate$iter$fn$fn (core.clj:96).
clojure.lang.ArraySeq cannot be cast to java.lang.CharSequence

我不确定如何迭代传入的参数并将每个元素作为一个单独的值,然后可以将其传递给另一个函数。

我最终使用代码的目标是比较日期列表并在其中找到最旧的日期。此代码只是尝试将每个参数解析为日期。

标签: javaclojurefunctional-programming

解决方案


(defn iterateDates
  [& dates]
  (let [ukFormatter (java.time.format.DateTimeFormatter/ofPattern "dd-MM-yyyy")]
    (for [i dates]
      (java.time.LocalDate/parse i ukFormatter))))

(iterateDates "09-10-2019" "10-10-2019" "11-10-2019")

这个版本应该可以工作。

(for [i [dates]]在原始代码中编写,它按您无意中指定的方式工作:

  1. 它使用了一个用于迭代的向量[],其中已经是一个序列。datesdates
  2. 这个向量的第一个元素是dates,它是一个AraySeq
  3. java.time.LocalDate/parse试图解析ArraySeq为 aCharSequence并失败。

推荐阅读