SND*_*SND 1 recursion haskell list
我在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) ]
]
Run Code Online (Sandbox Code Playgroud)
因此,换句话说,该函数应该组成一个列表,其中包含来自第一个列表的每个元组,并且在每种情况下结合N个剩余列表中的其他元组之一.
我试图为此编写一个递归算法,但无法处理N个其他列表组合元组的问题.对于两个元组列表,我会写一些类似于:
composeList [] _ = []
composeList (x:xs) list = composeTuples x list ++ composeList xs list
composeTuples _ [] = []
composeTuples t (x:xs) = [t,x] : composeTuples t xs
Run Code Online (Sandbox Code Playgroud)
这给了我:
*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) ]
]
Run Code Online (Sandbox Code Playgroud)
虽然我似乎无法把各个部分放在一起,使它适用于任意数量的列表,每个列表都有任何(> = 0)个元组.
我有兴趣用一些Haskell的预定义函数(如果可能的话)来解决这个问题,以及与上面的例子中的一个类似的方法.
提前致谢!
这只是列表monad,非确定性地从每个列表中选择一个元素.
你正在寻找的功能sequence :: Monad m => [m a] -> m [a]来自Control.Monad
?. 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)]
]
Run Code Online (Sandbox Code Playgroud)