我必须生成满足某些要求的所有可能的数字列表。 我知道如何针对固定尺寸的尺寸链。 伪代码:
[ [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中实现这个目标吗?
答案 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]]