3

我是 Clojure 的新手,所以最近几天我一直在阅读Clojure Koans 。在序列理解部分之前,事情进展得相当顺利。我在这部分苦苦挣扎。答案是可用的,但我不明白他们是如何得出这些答案的。在过去的两天里,我读了很多关于 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 经验的人,您能否解释一下他们是如何得出本节的解决方案的?不管我读了多少关于序列的内容,我都无法理解这一节。谢谢!

4

3 回答 3

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>))

我希望上面的例子能让你能够映射如何使用mapfilter代码来表达for

于 2012-10-16T14:50:09.900 回答
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)在检查时评估为真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,然后返回每个数字平方的惰性序列。

我的解释正确吗?

于 2012-10-17T16:13:28.877 回答
0

你了解它是如何for工作的吗?您是否在 Clojure API 文档中阅读过它?如果您知道如何使用for,那么您将无需做任何事情来“找到”这两个问题的解决方案;它们将是不言而喻的。

这些问题的目的是让您推断如何for工作。如果他们没有帮助您做到这一点,那么您最好阅读该主题。如果您在 上查找一些信息for,但发现难以理解,请编辑此问题以准确说明您的困惑之处,我(或其他人)可以尝试解释。

于 2012-10-16T14:34:28.197 回答