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

时间:2015-12-28 15:01:44

标签: list haskell recursion

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

提前致谢!

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

这是一个递归解决方案

<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
<div class="modal hidden">
  <div class="window">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Perspiciatis eligendi aperiam beatae officiis, sed perferendis quod laudantium. Aperiam, maxime, iure. Sapiente similique iusto modi harum vitae tempore amet neque impedit.</p>
  </div>
</div>
<h1>Contents</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Hic consectetur sapiente neque quas inventore eius, voluptatem minima alias ipsam facilis a id accusamus, laborum, nam, velit ut. Amet voluptatibus, doloremque.</p>
<p><a href="#modal">Open Modal Window</a></p>
<p>Ipsa aliquam voluptatibus reprehenderit, expedita, fuga explicabo pariatur sit nostrum rem, quis dolores eligendi culpa atque alias consequuntur et quas dolorum officiis ab amet repudiandae! Et eos, veritatis incidunt. Non?</p>
<p>Error, maiores beatae culpa deserunt quae dicta odio temporibus itaque provident. Totam doloremque iure, eveniet omnis dolorem a explicabo voluptate necessitatibus libero maiores reiciendis ipsam ad qui, perferendis, officiis praesentium.</p>
<p>Atque pariatur eligendi tempora enim nemo rerum officia a, modi ut, quasi deserunt hic consectetur. Laborum, sequi, porro rem dolores obcaecati nobis earum voluptatibus quia itaque ad nostrum similique blanditiis.</p>
<p>Explicabo eum architecto, eligendi similique. Aperiam autem illo nulla, laudantium ut, blanditiis harum a. Deserunt est, corporis sint quae numquam, placeat! Maxime beatae esse atque facere delectus iure cum incidunt.</p>
<p>Ipsa soluta est, voluptatibus voluptas beatae architecto alias culpa atque temporibus voluptatum recusandae mollitia deleniti. Possimus nihil accusamus quod dolores eligendi perspiciatis eos, maiores, officia numquam, id esse aperiam consequuntur.</p>
<p>Rerum eaque quisquam voluptate temporibus placeat in alias accusantium iste dolor eveniet neque quia ipsum quas itaque omnis eum animi mollitia fuga ex, reiciendis, recusandae ipsam deleniti inventore. Cupiditate, magni.</p>
<p>Hic praesentium labore quibusdam sunt non quis ipsum aut consectetur? Tempore ullam sit neque dolor, ad adipisci explicabo facilis excepturi, consequatur hic laboriosam a! Minus veniam tenetur quibusdam similique ipsum.</p>
<p>Eligendi, perferendis officiis illum eos, nesciunt delectus accusantium fugiat voluptatem ab nulla consequuntur magnam expedita ut pariatur. Quidem rem corporis dicta totam maiores cum cumque quibusdam! Inventore ratione libero voluptas!</p>
<p><a href="#modal">Open Modal Window</a></p>
<p>Distinctio veritatis provident quia voluptatem, aliquid explicabo voluptatum enim sit eius quae itaque expedita id. Voluptates eum sed, qui facilis cum suscipit, est ipsa dolor laborum. Totam magnam, vero assumenda.</p>
<p>Accusamus rerum fugit culpa, dignissimos nihil esse quidem maxime porro possimus dolor cupiditate voluptatum illo voluptatem, ut corrupti, voluptatibus? Reiciendis corporis maiores non quidem nam repellat, rem omnis adipisci deleniti!</p>
<p>Alias dolor, libero veniam a rerum qui iure aut officia repellendus in adipisci quidem incidunt quos ut delectus id fugiat sunt sapiente, officiis sint. Perspiciatis, harum quos in. Eveniet, magni.</p>
<p>Iste magnam suscipit necessitatibus libero nulla, molestias itaque blanditiis iure provident ad, hic architecto natus tempore quibusdam id voluptatibus inventore cupiditate laudantium dicta similique quisquam voluptas? Ratione ipsum, magnam qui!</p>
<p>Animi itaque repellendus error delectus, sequi voluptatibus earum libero beatae officia nam ullam nemo sit voluptatem vero, amet qui fuga harum aut ipsam, dolores eligendi! Repellendus, quis, quam. At, nulla?</p>
<p>Quam quos laborum id deserunt voluptatum commodi sunt dolor, ex debitis excepturi, necessitatibus! Deserunt iusto saepe numquam modi excepturi maxime iste! Non tenetur rem, impedit? Consequuntur obcaecati nam vitae velit.</p>

解决方案背后的想法如下:将列表头部的每个元素添加到递归计算输入列表尾部结果的每个列表中。