2011-05-28 18 views
2

結合名單我有沒有簽名在Haskell

combine 
    :: [[a]] -> [[a]] 

功能Combine需要從列表中建立的列表,(1份名單可能是無窮大,像重複1),並返回列表 最長列表(S)改變他們的順序。

combine [] = []  
combine [[]] = [[]]  
combine [[], [1]] = [[1]]  
combine [[1], [2]] = [[1],[2]]  
combine [[], repeat 1, []] = [repeat 1] value 

任何想法? 謝謝 代碼:
結合:: [[A] - > [一]
結合[] = []

結合((XS),[])= [XS]不工作由於某種原因

+1

請修改你的問題,以便更清楚;你可以在格式化中使用「代碼」按鈕(任何縮進4個空格將顯示爲一個塊)通過編輯你的文章 – ninjagecko 2011-05-28 17:20:12

+3

1)作業題目需要一個「家庭作業」標籤。 2)所有的問題應該包括你的嘗試和想法,所以我們可以幫助你,而不是爲你做的工作。 3)我無法理解你想從你的文本中「結合」什麼。 4)請使用Stackoverflow提供的「代碼塊」格式選項來格式化您的代碼。 – 2011-05-28 17:20:22

+1

「不知何故,我必須結合,它會列出清單x的列表,並且我們推定x是最終的,並且只有1個列表可能是無窮大的,它將返回具有最長列表的列表x而不改變它們的順序「 - 你還應該澄清你正在努力做什麼,爲什麼要努力去做,以及到目前爲止你做了什麼嘗試 – ninjagecko 2011-05-28 17:23:07

回答

2

你需要用遞歸函數來解決這個問題。

考慮構建累加器的遞歸算法 - 如果您不熟悉累加器的概念,請求澄清。該累加器的類型爲[[a]],與我們的函數的返回類型相同。當我們使用遞歸函數迭代列表的列表時,如果它們與累加器中的其他列表的長度相同,我們會將其列入累加器,或者如果它們的長度較短,則忽略它們。但是,如果列表的長度更大,我們會取消累加器中的所有其他內容,並只保留新的更長的列表。

這含糊地描述了一種可用於解決此問題的線性算法。如果您希望獲得更多解釋,請在評論中提問。

0

首先,你需要一個比較功能,如:

cmp [] [] = EQ 
cmp [] _ = LT 
cmp _ [] = GT 
cmp (x:xs) (y:ys) = cmp xs ys 

然後你就可以使用對當前的「最大值」的儲液器的輔助函數:

combine :: [[a]] -> [[a]] 
combine [] = [] 
combine (x:xs) = comb xs [x] where 
    comb [] acc = acc 
    comb (x:xs) (y:ys) = case x `cmp` y of 
          EQ -> ??? 
          LT -> ??? 
          GT -> ??? 

我想你可以弄清楚在不同情況下要做什麼...