如何在Clojure中进行列表理解?

Nic*_*ick 6 haskell list-comprehension clojure

我正在学习Clojure,我找到了解决方案,使用列表理解在Haskell书中找到正确的三角形问题,使问题得到彻底解决:

找到正确的三角形

  • 三边的长度都是整数.

  • 每边的长度小于或等于10.

  • 三角形的周长(边长的总和)等于24.

在Haskell:

ghci> let rightTriangles' = [ (a,b,c) | c <- [1..10], a <- [1..c], b <- [1..a],
a^2 + b^2 == c^2, a+b+c == 24]

ghci> rightTriangles'
[(6,8,10)]
Run Code Online (Sandbox Code Playgroud)

在Clojure中有这样一个优雅的列表理解解决方案吗?

J. *_*son 12

Clojure有for语法:

(for [ c (range 1 (inc 10))
       a (range 1 (inc c))
       b (range 1 (inc a))
       :when (== (+ (* a a) (* b b)) 
                 (* c c))
       :when (== (+ a b c) 24) ]
  [a b c])
Run Code Online (Sandbox Code Playgroud)


ama*_*loy 8

(for [c (range 1 11)
      a (range 1 c)
      b (range 1 a)
      :when (and (= (+ a b c) 24)
                 (= (* c c) (+ (* a a) (* b b))))]
  [a b c])
Run Code Online (Sandbox Code Playgroud)

您还可以通过:let [c2 (* c c)]在绑定ab绑定之间插入来提高性能,然后c2在中使用:when,以避免c比必要更频繁地进行平方.

Clojure for基本上是列表monad的表示法,:when表现得像guard,:let表现得像let.也有:while,但我不知道对应的什么haskell事情.