2024 Clojure 状态调查!中分享您的想法。

欢迎!请在关于页面查看更多此工作方式的信息。

0
集合

我想创建一个配对列表,最好把它作为一个配对的配对序列来构建

(for [ni (range n)
          di (range d)]
     (let [j1 (mod (inc di) n)
              j2 (mod (- n (inc di)) n) ]
          (conj [] [ni j1] [ni j2]) ))

这让我接近了目标

([[0 1] [0 9]] [[0 2] [0 8]] [[1 1] [1 9]]...

但这会添加一个额外的括号层次。我希望看起来像这样

([0 1] [0 9] [0 2] [0 8] [1 1] [1 9] ...

我确信这个简单的解决方案很简单,但我却想不出来!?

2 个答案

0

精选
 
最佳答案

另一个选项是将配对用作另一组绑定

(for [ni (range n)
      di (range d)
      :let [j1 (mod (inc di) n)
            j2 (mod (- n (inc di)) n)]
      p [[ni j1] [ni j2]]]
  p)

The "interesting" expression doesn't have to be in the return position of for :)

太好了,谢谢!也感谢@alexmiller。我更喜欢这个答案,因为它更好地保留了说明性的`for`结构。
0
 Site Name

有许多方法可以做到这一点,其中一种就是从使用for改变为嵌套使用mapcats。

(mapcat 
  (fn [ni] 
    (mapcat 
      (fn [di] 
        (let [j1 (mod (inc di) n)
              j2 (mod (- n (inc di)) n)]
          [[ni j1] [ni j2]])) 
      (range d))) 
  (range n))
...