不知道如何从以下位置创建 ISeq:Java.lang.Long

Don't know how to create ISeq from: Java.lang.Long

提问人:Sirgeorge 提问时间:5/17/2022 更新时间:5/17/2022 访问量:477

问:

在递归和映射实现方面做一些练习,以消除 Clojure 的一些锈迹。我只在这里使用列表,那么我如何尝试混合 seq 和不可 seq 的东西?

(defn mapset
  ([operator operand] (mapset operator operand '()))
  ([operator operand finished-set]
   (if (empty? operand)
     '(finished-set)
     (mapset operator (rest operand) (into finished-set (operator (first operand)))))))

回复:

namespace.name> (mapset + '(1 3 4 6 5))
Execution error (IllegalArgumentException) at tester.core/mapset (core.clj:38).
Don't know how to create ISeq from: java.lang.Long
Java 强制转换 clojure 序列 read-eval-print-loop

评论


答:

0赞 Alan Thompson 5/17/2022 #1

此错误意味着当它需要序列(列表、向量等)时,您不小心给它一个整数:

demo.core=> (first 5)
Execution error (IllegalArgumentException) at demo.core/eval2055 (form-init5218243389029929734.clj:1).
Don't know how to create ISeq from: java.lang.Long

评论

0赞 Sirgeorge 5/17/2022
你说得比我更雄辩。我怀疑这是一个可能的原因,但我不确定。将来,我会牢记这一点。
1赞 Martin Půda 5/17/2022 #2

一些错误:

  • 替换为'(finished-set)finished-set
  • into 将元素从一个集合添加到另一个集合,我想你正在寻找 conj(这就是IllegalArgumentException)
  • 如果你要使用 ,你必须使用 作为首字母,因为将元素添加到列表的开头,但在向量的末尾conj[]finished-setconj

您的功能,只需进行最小的更改:

(defn mapset
  ([operator operand] (mapset operator operand []))
  ([operator operand finished-set]
   (if (empty? operand)
     finished-set
     (mapset operator (rest operand) (conj finished-set (operator (first operand)))))))

测试:

(mapset inc '(1 3 4 6 5))
; => [2 4 5 7 6]

(mapset dec '(1 3 4 6 5))
; => [0 2 3 5 4]

您也可以使用缺点仅使用两个参数来编写它:

(defn mapset [operator operand]
  (if (empty? operand) 
    '()
    (cons (operator (first operand))
          (mapset operator (rest operand)))))

请注意,这两个版本都不是懒惰的,这需要添加 lazy-seq

评论

0赞 Sirgeorge 5/17/2022
太棒了!成功了。有趣的是,在尝试修复错误时,我得到了您粘贴的代码(我实际上通过将代码倒退几个步骤进行了双重检查,是的,就是这样)。唯一的区别是空之后的回报?检查在括号中。这让我在tester.core/mapset(core.clj:37)上出现执行错误(ArityException)。传递给的参数 (0) 数量错误:clojure.lang.PersistentVector 你知道是什么原因造成的吗?