我必须生成满足某些要求的所有可能的数字列表。对于固定尺寸的链条,我知道如何做到这一点。伪代码:
[ [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
和碰撞中选择一个以此类推。当我有一个结果时。我希望它从 Xn 满足要求中挑选其他人。然后返回以选择另一个有效的,然后再次返回并生成所有不再发生碰撞。然后我想更深入地回归等等。这是列表理解所做的,但我希望它用于动态大小。X2
X1
X3
X1
X2
Xn
Xn-1
Xn
我知道列表理解是语法糖所以要动态生成它我可能必须使用 monads,但我不知道如何:) 你能帮我如何在 Haskell 中实现这一点吗?