簡體   English   中英

用於列表列表中元組序列的Haskell算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM