将向量输入自制 Clojure 函数时出现问题

问题描述 投票:0回答:1

我对 Clojure 非常陌生,我有一个简单的问题需要解决,但谷歌搜索并没有帮助解决这个问题。正如学习如何在 Clojure 中创建函数的练习一样,我尝试创建一个函数,该函数采用向量的值并按以下方式计算它们的算术平均值:

(defn mean [vec]
(   let [x (reduce + vec), y (count vec)] 
    (x / y)
))

当我通过输入

(sum vec_foo)
创建名称为 vec_foo 的向量后在解释器中运行此命令时,我收到以下消息:

用户/总和 (REPL:1) 处的执行错误 (ClassCastException)。 java.lang.Long 类不能转换为 clojure.lang.IFn 类(java.lang.Long 位于加载器“bootstrap”的 java.base 模块中;clojure.lang.IFn 位于加载器“app”的未命名模块中)

尝试

(apply sum vec_foo)
时,会出现以下消息:

user/eval369 (REPL:1) 处出现执行错误 (ArityException)。 错误数量的参数 (5) 传递给:user/sum

我最初的目标是仅获取向量值的平均值作为输出,但这些错误消息也非常有趣。任何有关错误消息含义或解决问题的信息将不胜感激。

function vector clojure
1个回答
0
投票

在您的代码中,

x
始终是 Long

当您运行

(x / y)
时,它会尝试将
x
作为函数调用,但您无法将 Long 转换为函数。

你想做的是

(/ x y)

关于

sum
,由于您没有分享实现,我只能猜测:可能
(sum vec_foo)
可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.