gpt4 book ai didi

Clojure clojure.lang.LazySeq 错误

转载 作者:行者123 更新时间:2023-12-02 11:13:43 26 4
gpt4 key购买 nike

我似乎在 clojure I/O(或类型系统)方面遇到了严重的问题。重点是这个函数,我希望使用字符串和数字或字符串的集合,并返回与数字关联的字符串字典,例如

(costlist '( '("Milk" 4) '("Bread" 2) '("Milk")))

给予

{"牛奶"4, "面包"2 }

定义为

(defn costlist [lst]
;returns list of costs and appropriate names
(let [snds (filter (fn [x] (not (identical? nil x))) (seconds lst))]
(zipmap
(firsts (take (count snds) (firsts lst)))
(snds lst))))

当使用 clojure.lang.PersistentList 类型的列表(我从 clojure.lang.LazySeq 转换而来)时抛出错误消息

clojure.lang.LazySeq cannot be cast to clojure.lang.IFn

这只会让我感到困惑,因为它的任何参数对我来说似乎都不是 LazySeq。

最佳答案

问题是 snds 是惰性序列,因此 (snds lst) 会抛出错误。 filter 始终返回惰性序列。

你的函数也太复杂了。尝试让它变得更简单:

(defn costlist [lst]
(zipmap (map first lst)
(remove nil? (map second lst))))

现在你可以做你想做的事了:

(costlist (list '("Milk" 4) '("Bread" 2) '("Milk")))

我使用 list 因为 quote 会阻止对表达式 ( see ToBeReplaced's answer ) 求值:

=> '( '("Milk" 4) '("Bread" 2) '("Milk"))
((quote ("Milk" 4)) (quote ("Bread" 2)) (quote ("Milk")))

因此,您应该避免使用 quote 来构建列表。

您的解决方案还表明 nil 值可能仅出现在列表末尾。您可以轻松修复它:

(defn costlist [lst]
(->> (filter (comp #{2} count) lst)
(map vec)
(into {})))

所以,现在

(costlist (list '("Milk" 4) '("Milk") '("Bread" 2)))

也会起作用。

关于Clojure clojure.lang.LazySeq 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com