0

我必须生成满足某些要求的所有可能的数字列表。对于固定尺寸的链条,我知道如何做到这一点。伪代码:

[ [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 满足要求中挑选其他人。然后返回以选择另一个有效的,然后再次返回并生成所有不再发生碰撞。然后我想更深入地回归等等。这是列表理解所做的,但我希望它用于动态大小。X2X1X3X1X2XnXn-1Xn

我知道列表理解是语法糖所以要动态生成它我可能必须使用 monads,但我不知道如何:) 你能帮我如何在 Haskell 中实现这一点吗?

4

1 回答 1

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]]
于 2013-06-18T10:22:28.793 回答