[英]Haskell algorithm for sequence of tuples in a list of lists
我在Haskell玩了些游戏以熟悉它,但是遇到了以下问题:
我想定义一个函数,给定一个包含一些其他列表(每个列表包含0个或多个元组)的列表,创建一个新列表,如下所示:
*Main> foo
[
[ (1,2), (3,4) ],
[ (5,6) ],
[ (7,8), (9,10) ]
]
= [
[ (1,2), (5,6), (7,8) ],
[ (1,2), (5,6), (9,10) ],
[ (3,4), (5,6), (7,8) ],
[ (3,4), (5,6), (9,10) ]
]
因此,换句话说,该函数应组成一个列表,其中第一个列表中的每个元组应与N个其余列表中的其他每个元组分别组合。
我试图为此编写一个递归算法,但是无法处理与N个其他列表结合在一起的元组。 对于仅两个元组列表,我将编写如下内容:
composeList [] _ = []
composeList (x:xs) list = composeTuples x list ++ composeList xs list
composeTuples _ [] = []
composeTuples t (x:xs) = [t,x] : composeTuples t xs
这给了我:
*Main Data.List> composeList [(1,2),(3,4)] [(5,6),(7,8)]
[
[ (1,2), (5,6) ],
[ (1,2), (7,8) ],
[ (3,4), (5,6) ],
[ (3,4), (7,8) ]
]
尽管我似乎无法将各个部分组合在一起,以使其适用于任意数量的列表,每个列表都具有任意(> = 0)个元组。
我都想通过使用Haskell的一些预定义函数(如果可能)以及一种与上例中使用的方法类似的方法来解决此问题。
提前致谢!
这只是列表单子,是不确定地从每个列表中选择一个元素。
您要查找的函数是Control.Monad
sequence :: Monad m => [ma] -> m [a]
λ. let as = [(1,2),(3,4)]
λ. let bs = [(5,6)]
λ. let cs = [(7,8),(9,10)]
λ. let xss = [as, bs, cs]
λ. sequence xss
[[(1,2),(5,6),(7,8)]
,[(1,2),(5,6),(9,10)]
,[(3,4),(5,6),(7,8)]
,[(3,4),(5,6),(9,10)]
]
这是一个递归解决方案
solution :: [[a]] -> [[a]]
solution (x: xs) = [y: ys | y <- x, ys <- solution xs]
solution [] = [[]]
解决方案的思想如下:将列表头的每个元素放在每个通过递归计算输入列表尾部结果而获得的列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.