当前位置:  开发笔记 > 人工智能 > 正文

Haskell算法用于列表列表中的元组序列

如何解决《Haskell算法用于列表列表中的元组序列》经验,为你挑选了1个好方法。

我在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的预定义函数(如果可能的话)来解决这个问题,以及与上面的例子中的一个类似的方法.

提前致谢!



1> cdk..:

这只是列表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)]
  ]

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有