我是Clojure的新手,所以过去几天我一直在经历Clojure Koans。事情进展顺利,直到section on sequence comprehensions。我正在努力解决这个问题。 answers可用,但我不明白 他们是如何得出这些答案的。在过去的两天里,我已经阅读了很多关于Clojure的内容,但它与Ruby有很大的不同,我需要一段时间才能理解它。
该部分有五个“问题”,我无法弄明白。以下是两个特别困扰我的问题的例子:
"And also filtering"
(= '(1 3 5 7 9)
(filter odd? (range 10))
(for [index __ :when (odd? index)]
index))
"And they trivially allow combinations of the two transformations"
(= '(1 9 25 49 81)
(map (fn [index] (* index index))
(filter odd? (range 10)))
(for [index (range 10) :when __]
__))
对于有Clojure经验的人,你能解释他们是如何得出这一部分的解决方案的吗?无论我读了多少关于序列的内容,我都无法绕过这一部分。谢谢!
答案 0 :(得分:2)
我假设您理解map
和filter
函数,我猜它们也存在于Ruby中。让我举个例子,可能会帮助您理解for
在这种情况下的使用。
(map <some function to map a value>
(filter <some function to return true OR false to filter values>
<a sequence of values>))
上面的代码使用filter
对一系列值进行了一些过滤,然后使用map
函数将过滤后的序列的每个值映射到其他值。
for
基本上允许你做同样的事情,如下所示
(for [index <a sequence of values>
:when <some expression to return true OR false by check index value>]
(<some expression to map a value i.e transform index to something else>))
我希望上面的示例可以让您能够使用map
filter
和for
代码的表达方式
答案 1 :(得分:1)
这个解释有所帮助,经过几天沉浸在Clojure之后,我对这种语言感觉更舒服。为了确保理解,我将完成这两项测试。
"And also filtering"
(= '(1 3 5 7 9)
(filter odd? (range 10))
(for [index (range 10) :when (odd? index)]
index))
'(1 3 5 7 9)
是0到9之间所有奇数的列表
(filter odd? (range 10))
会在对(range 10)
进行检查时返回评估为true的集合odd?
中所有项目的列表。返回值等于第一个列表
(for)
基本上是for循环。它是迭代的。 (for [index (range 10)] index)
会将0到9之间的所有数字绑定到变量index
,然后返回index
,对吗?
因此(for [index __ :when (odd? index)] index))
添加了index
是奇数的条件。返回值等于前两个。
这是对的吗?
"And they trivially allow combinations of the two transformations"
(= '(1 9 25 49 81)
(map (fn [index] (* index index))
(filter odd? (range 10)))
(for [index (range 10) :when (odd? index)]
(* index index)))
这里map
函数需要一个函数。这个匿名函数接受一个参数并将该参数自身相乘。 map
将把这个函数应用于它传递的集合中的每个元素。该集合是0到9之间的奇数。
for
在奇数时将每个数字从0到9设置为变量index
,然后返回一个延迟序列,其中每个数字都是平方。
我的解释是否正确?
答案 2 :(得分:0)
您了解for
的工作原理吗?你有read about it in the Clojure API docs吗?如果您知道如何使用for
,那么您将无法做任何事情,以及#34;到达&#34;这两个问题的解决方案;他们将是不言而喻的。
这些问题的目的是推断for
的工作原理。如果他们没有帮助您这样做,那么您最好先阅读这个主题。如果您在for
上查找某些信息,但发现难以理解,请编辑此问题以准确说明令您感到困惑的内容,我(或其他人)可以尝试解释。