【发布时间】:2013-08-28 21:20:40
【问题描述】:
我正在做 clojure/core.logic koans 并坚持this one:
"Here we give run a specific number to control how many answers we get. Think
carefully. Is there only one list in the universe that satisfies this relation?
Are there infinitely many?"
(= (run 1 [q]
(membero 'cat q))
[__])
在 REPL 中运行 (run 1 [q] (membero 'cat q)) 告诉我答案是 ((cat . _.0))。我不太确定中间的点是什么意思,但无论如何,在原始公文中粘贴 '(cat . _.0) 而不是 __ 占位符并没有帮助(断言仍然失败)。你能指出我正确的方向吗?还要解释cat 和_.0 之间的点是什么意思?我的猜测是,这意味着 接下来的内容(即_.0)是任意长度的尾巴,但我不能 100% 确定。
=== 更新
amalloy 为我指明了正确的方向(谢谢,先生!)。 lcons 成功了:
(= (run 1 [q]
(membero 'cat q))
[(lcons 'cat '_.0)])
还有一点 REPL:
user=> (lcons 'cat '_.0)
(cat . _.0)
user=> '(cat . _.0)
(cat . _.0)
user=> (= '(cat . _.0) (lcons 'cat '_.0))
false
这个点用来表示dotted lists。根据Wikipedia,点列表是一种不正确的列表,另一种是循环列表。因此,在上面的 REPL 会话中,第一个列表是带有两个元素('cat 和 '_.0)的虚线列表,而第二个列表是带有三个元素('cat'、'. 和 @987654340)的正确列表@)。它们的字符串表示是相同的,但它们是不同的。
【问题讨论】:
-
我只是想说谢谢你链接到逻辑 koans。我从来不知道他们,必须说他们很棒。它们应该链接在 core.logic 页面上!
标签: clojure clojure-core.logic