我读了很多关于Clojure的文档(并且需要再次阅读它),并阅读了几篇关于这个Clojure的问题以获得对该语言的“感觉”。除了elisp中的一些小函数之外,我从来没有用过任何Lisp语言编写过。我在Clojure编写了我的第一个项目Euler解决方案,在进一步深入之前,我想更好地了解一下地图和减少。什么在使用地图时返回一个集合
使用Lambda,我结束了以下(总结3或5或同时1和1000(含)之间的所有倍数):
(reduce + (map #(if (or (= 0 (mod %1 3)) (= 0 (mod %1 5))) %1 0) (range 1 1000)))
我把它放在同一行,因为我写的在REPL上(它给出了正确的解决方案)。
没有拉姆达,我写了这个:
(defn val [x] (if (or (= 0 (mod x 3)) (= 0 (mod x 5))) x 0))
然后我计算解决方案这样做:
(reduce + (map val (range 1 1000)))
在这两种情况下,我的问题是关于地图做之前应该返回什么, 减少。在做完地图后,我注意到我最后列出了一个如下所示的列表:(0 0 3 0 5 6 ...)。
我试图在VAL定义的末尾去除“0”但我接收由列表(零零零3 5 6等)。我不知道无是否有问题。无论如何,我发现我会在做一个折叠的时候总结一下,所以零不是真正的问题。
但仍然:什么是一个合理的地图返回? (0 0 3 0 5 6 ...)或(无零3无5 6 ...)或(3 5 6 ...)(我将如何处理这最后一个?)或其他?
我应该“过滤”零点/零点,如果是的话如何?
我知道我在问一个基本问题,但map/reduce显然是我会用的很多,所以任何帮助都是值得欢迎的。
+1 ......我不知道直观:)我只是想多读文档,尽我所能,但随后的问题是,我知道我已经忘了几个事情,我读:)让我们回到映射产生的数据,如果我有一个情况,我不希望零(在这种情况下罚款),也不在输出零?在ouptut集合中“过滤”不需要的元素的常见Clojure方法是什么?只需使用* filter *? – 2012-04-27 20:43:54
是的,如果发现你自己说,喔,我可以“只使用X”你可能在正确的轨道 – 2012-04-27 20:53:58
@ArthurUlfeldt在何种意义上减少“决定如何处理包括”? – Thumbnail 2014-04-06 09:31:51