Haskell:如何更改算法以适用于任何大小的列表?

时间:2016-11-06 00:13:34

标签: algorithm haskell

我有这段代码:

project= [ 
  [(a,b),(c,d),(e,f)] 
  | 
    a<-[1..5],
    b<-[1..3],
    c<-[1..5],
    d<-[1..3],
    e<-[1..5],
    f<-[1..3]

  , a*b + c*d + e*f <6
  , a + c + e == 5
  , b == 3 || d==3 || f==3
  ]

x=take 1 project
main = print $  x

返回3对[(x,y),(x,y),(x,y)]的列表。 有三个条件:

  • 如果你总结所有x,你必须得到5。
  • 如果你将所有x*y加起来,你将得到少于6个。
  • 至少有一个y等于3。

现在,我希望完全相同的算法适用于任何更长的列表,例如10对。我该怎么做?

1 个答案:

答案 0 :(得分:0)

下面:

project n =
  [ x
  | x <- replicateM n $ liftA2 (,) [1..5] [1..3]
  , sum (map (uncurry (*)) x) < 6
  , sum (map fst x) == 5
  , any ((==3) . snd) x
  ]
main = print $ take 1 $ project 3

或者像这样:

project n
  = filter (any ((==3) . snd))
  $ filter ((==5) . sum . map fst)
  $ filter ((<6) . sum . map (uncurry (*)))
  $ replicateM n
  $ liftA2 (,) [1..5] [1..3]