Haskell未知大小列表理解

时间:2013-06-18 09:31:59

标签: haskell

我必须生成满足某些要求的所有可能的数字列表。 我知道如何针对固定尺寸的尺寸链。 伪代码:

[ [x1,x2,x3]| x1<-[1..5],x2<-[20..30], x2 `basedOn` x1, x3<-[100..110], x3 `basedOn` x1+x2]

其中basedOn是一些布尔过滤器。

但是如何做到链的长度是在运行时确定的,也就是变量?

我为每个Xn生成了不同的集合。基本上我想做的是为X1,X2..Xn生成集合。然后我想从X1中选择一个元素并从X2中选择一个与X1不相符的元素然后我想从X3中选择一个不与{{1}发生碰撞的元素}和X1依此类推X2。当我有一个结果。我希望它从Xn会议要求中挑选其他人。然后返回Xn选择另一个有效,然后再次返回Xn-1并生成所有不再发生碰撞。然后我想要更深入等等。这就是列表理解的作用,但我希望它具有动态大小。

我知道列表符号是语法糖因此动态生成它我可能必须使用monads,但我不知道如何:) 你能帮我解决一下如何在Haskell中实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

在列表推导中使用递归:

import Data.Maybe

basedOn :: Int -> Int -> Bool
basedOn a b = even (a+b)

func :: [[Int]] -> [[Int]]
func a = myFun a Nothing where
  myFun :: [[Int]] -> Maybe Int -> [[Int]]
  myFun [] _ = [[]]
  myFun (xs:xss) j  = [[a] ++ b | a <- xs, b <- myFun xss (next j a), pred j a]
                    where
                      pred Nothing _ = True
                      pred (Just x) a = a `basedOn` x
                      next Nothing a = Just a
                      next (Just x) a = Just (x+a)

main = putStr $ show $ func [[1..5] , [6..10], [11..15]]