Clojure Koans:麻烦理解序列理解部分

时间:2012-10-16 14:19:36

标签: clojure sequences

我是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经验的人,你能解释他们是如何得出这一部分的解决方案的吗?无论我读了多少关于序列的内容,我都无法绕过这一部分。谢谢!

3 个答案:

答案 0 :(得分:2)

我假设您理解mapfilter函数,我猜它们也存在于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

来映射filterfor代码的表达方式

答案 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上查找某些信息,但发现难以理解,请编辑此问题以准确说明令您感到困惑的内容,我(或其他人)可以尝试解释。