我需要定义一个名为(get-all-pairs key seq)的函数
它返回seq中所有以第一个元素为键的对的列表.如果没有对匹配,则返回空列表.
例如,如果我说宠物
(def pets
'((cat 1) (dog 1) (fish 1) (cat 2) (fish 2))
)
Run Code Online (Sandbox Code Playgroud)
(get-all-pairs 'cat pets)返回((cat 1) (cat 2))并(get-all-pairs 'bird pets)返回'().
这是我的尝试:
(defn get-all-pairs [key seq]
(cond
(= key (first(first(seq)))) (cons (first seq)
(get-all-pairs key (rest seq)))
:else '()))
Run Code Online (Sandbox Code Playgroud)
但它不起作用.如果我打电话给它,它的消息如下:
#'proj2.proj2/pets
=> (get-all-pairs 'cat pets)
ClassCastException clojure.lang.PersistentList cannot be cast to clojure.lang.IFn proj2.proj2/get-all-pairs (proj2.clj:20)
Run Code Online (Sandbox Code Playgroud)
我不知道问题出在哪里.怎么解决?
如果两个列表完全相同(元素的顺序很重要),我想编写一个返回 true 的函数。
我是这样试的:
same([ ], [ ]).
same([H1|R1], [H2|R2]):-
H1 == H2,
same(R1, R2).
Run Code Online (Sandbox Code Playgroud)
当两个列表相同时它返回真,我也希望如果我有
?- same(X, [1, 2, 3]).
Run Code Online (Sandbox Code Playgroud)
我想要它回来
X = [1, 2, 3].
Run Code Online (Sandbox Code Playgroud)
但是这样输入就不行了。以下是我得到的一些示例输出:
?- same([1, 2], [1, 2]).
true.
?- same([2, 1], [1, 2]).
false.
?- same(X, [1, 2, 3]).
false.
?- same([1, 2, 3], [1, 2, X]).
false.
Run Code Online (Sandbox Code Playgroud)
如何解决?