理解一点Haskell

Jos*_*osh 2 haskell predicate set combinatorics

我有一个关于Haskell的快速​​问题.我一直在跟踪学习你是一个Haskell,我对以下片段的执行顺序/逻辑感到有点困惑,用于计算三角形的边长,当所有边都等于或小于10时三角形的总周长为24:

[(a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, a+b+c==24]

被混淆到我的部分是结合对的上部扩张ba结合.从我所收集的..c,并..b用于去除更多的排列相同的一组三角形边的(组合?).

当我用它运行时..c/b,我得到答案:

[(6,8,10)]

当我没有..c/b:

[(a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a^2 + b^2 == c^2, a+b+c==24]

正如我最初输入时没有的那样,我得到了:

[(8,6,10),(6,8,10)]

这显然代表了相同的三角形,除了ab值已被交换.

那么,有人可以引导我完成逻辑/执行/评估这里发生的事情吗?

sep*_*p2k 7

原始版本考虑所有三元组(a,b,c),其中c是介于1和10之间的数字,b是介于1和c之间的数字,a是介于1和b之间的数字.(6,8,10)符合该标准,(8,6,10)不符合(因为这里a是8,b是6,所以a不在0和6之间).

在你的版本中你考虑所有三元组(a,b,c),其中a,b和c在1到10之间.你对a,b和c如何相互关联没有限制,所以(8,6,10)不排除因为其中的所有数字确实在1到10之间.

如果您从命令式for循环中考虑它,您的版本会这样做:

for c from 1 to 10:
  for b from 1 to 10:
    for a from 1 to 10:
      if a^2 + b^2 == c^2 and a+b+c==24:
        add (a,b,c) to the result
Run Code Online (Sandbox Code Playgroud)

原始版本执行此操作:

for c from 1 to 10:
  for b from 1 to c:
    for c from 1 to b:
      if a^2 + b^2 == c^2 and a+b+c==24:
        add (a,b,c) to the result
Run Code Online (Sandbox Code Playgroud)