小编Mic*_*icM的帖子

Clojure返回seq中所有以第一个元素为键的对的列表

我需要定义一个名为(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)

我不知道问题出在哪里.怎么解决?

clojure seq

2
推荐指数
1
解决办法
235
查看次数

prolog 两个列表完全一样

如果两个列表完全相同(元素的顺序很重要),我想编写一个返回 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)

如何解决?

list prolog

1
推荐指数
1
解决办法
9737
查看次数

标签 统计

clojure ×1

list ×1

prolog ×1

seq ×1