gpt4 book ai didi

clojure - 如何防止 Clojure 异常 : clojure. lang.LazySeq cannot be cast to clojure.lang.IFn

转载 作者:行者123 更新时间:2023-12-04 06:02:42 33 4
gpt4 key购买 nike

我试图将从映射操作返回的(惰性)序列传递给另一个映射操作,以便我可以在第一个序列中查找元素。代码从文本文件(以行/列格式)解析一些足球装置,清理它,然后返回一张 map 。

这是代码:

(ns fixtures.test.lazytest
(:require [clojure.string :as str])
(:use [clojure.test]))

(defn- column-map
"Produce map with column labels given raw data, return nil if not enough columns"
[cols]
(let [trimmed-cols (map str/trim cols)
column-names {0 :fixture-type, 1 :division, 2 :home-team, 4 :away-team}]
(if (> (count cols) (apply max (keys column-names)))
(zipmap (vals column-names) (map trimmed-cols (keys column-names)))
nil)))

(deftest test-mapping
(let [cols '["L" " Premier " " Chelsea " "v" "\tArsenal "]
fixture (column-map cols)]
(is (= "Arsenal" (fixture :away-team)))
(is (= "Chelsea" (fixture :home-team)))
(is (= "Premier" (fixture :division)))
(is (= "L" (fixture :fixture-type)))
)
)

(run-tests 'fixtures.test.lazytest)

我采取的方法是:
  • 清理列数据的向量(去除前导/尾随空格)
  • 使用zipmap,将列名关键字与其在列数据中对应的元素结合起来(注意不是所有的列都被使用)

  • 问题是,在 zipmap 中使用 trimmed-cols 会导致

    java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IFn



    我想我知道为什么会发生这种情况……因为 trimmed-cols 是一个 LazySeq,从 zipmap 调用的 map 反对接收一个非函数作为它的第一个参数。

    为了解决这个问题,我可以将 let 更改为:
    trimmed-cols (vec (map str/trim cols))

    但这并不是“最佳”选择。

    所以:
  • 是否有一个很好的通用解决方案来使用映射操作的结果作为另一个映射的“函数”参数?
  • 是否有更好的方法来从原始值数据的向量中导出 {: value} 对的映射,其中未使用所有向量元素?

  • (我对寻求一个惯用的解决方案犹豫不决,但想象一下在某个地方必须有一种普遍接受的方式来做到这一点。)

    最佳答案

    我不完全确定你在追求什么,但我可以理解为什么你的代码失败 - 就像你说的,trimmed-cols不是函数。这不是简单的工作吗?

    我正在使用 :_dummy应该跳过的列的键。您可以在 column-names 中使用任意数量的矢量:zipmap将它们合并为一个,由 dissoc 删除.

    (defn- column-map
    "Produce map with column labels given raw data, return nil if not enough columns"
    [cols]
    (let [trimmed-cols (map str/trim cols)
    column-names [:fixture-type :division :home-team :_dummy :away-team]]
    (if (>= (count cols) (count column-names))
    (dissoc (zipmap column-names trimmed-cols) :_dummy)
    nil)))

    (column-map ["L" " Premier " " Chelsea " "v" "\tArsenal "])
    ; => {:away-team "Arsenal", :home-team "Chelsea", :division "Premier", :fixture-type "L"}

    关于clojure - 如何防止 Clojure 异常 : clojure. lang.LazySeq cannot be cast to clojure.lang.IFn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769192/

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