gpt4 book ai didi

clojure - 尝试在函数调用中按索引获取序列的第一个元素时出错

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

我在执行 4clojure.com 的任务时遇到问题。以下是任务的描述:

Write a function which returns the last element in a sequence.

我使用以下代码解决了这个问题:

#(first (reverse %))

当我想用一些索引更改 first 函数时。像这样:

#(0 (reverse %))

我收到一个错误:

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

我的问题是:为什么我会收到此错误?我无法得到它,因为例如([1 2 3 4] 0) 完全有效并返回序列的第一个元素,那么为什么我不能在函数中使用数组的索引?

编辑1:即使下面的代码也不起作用,我想 APercientVector 是第一个。

#((reverse %) 0)

编辑2:我设法通过将从 reverse 函数返回的列表转换为向量来使其工作。谢谢@乔什

(#((vec (reverse %)) 0)[1 2 3])

最佳答案

如果您查看 APersistentVector 的代码,你会看到:

public abstract class APersistentVector extends AFn ...

AFn 实现了 IFn,它扩展了 java 的 CallableRunnable 接口(interface),这意味着 clojure 持久化向量可以作为函数调用,参数用作要检索的索引。你可以看到这个here :

public Object invoke(Object arg1) {
if(Util.isInteger(arg1))
return nth(((Number) arg1).intValue());
throw new IllegalArgumentException("Key must be integer");
}

map 和集合也是如此;它们都可以作为函数调用:

({:a 1 :b 2} :b)  ;; 2
(#{:a :b} :a) ;; :a
([1 2 3 4] 0) ;; 1

但是,Long(您的数字零)不会实现IFn:

(ancestors (class 42))
=>
#{java.lang.Comparable
java.lang.Number
java.lang.Object
java.io.Serializable}

因此,它不能作为函数调用。

关于clojure - 尝试在函数调用中按索引获取序列的第一个元素时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45378569/

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