2010-11-07 114 views
0

我對Haskell非常感興趣,並且正在嘗試解決這個問題。結合列表

爲了解決這個問題,必須由A匹配輸出列表C(X,Z)(X,Y)和由B(Y,Z)(無重複)的問題y必須是在甲等於和B.

因此,例如:

A = [("z","x")] 
B = [("x","c"), ("x","d")] 

結果:

C = [("z","c"), ("z","d")] 

任何想法?我今天開始用:

main = print(map describeList3 list_A) 

describeList3 :: ([Char], [Char]) ->Maybe [[Char]] 
describeList3 element = printParam(snd element)        

printParam :: String -> Maybe [[Char]] 
printParam param = (Map.lookup param $ myFilter list_B) 

myFilter :: (Ord k) => [(k, a)] -> Map.Map k [a] 
myFilter xs = Map.fromListWith (++) $ map (\(k,v) -> (k,[v])) xs 

目前卡住了...幫助?

+1

如果這是家庭作業,最好爲它添加標籤'homework'。 – Ashe 2010-11-07 10:17:15

+0

@Arlen:[「作業標籤與其他所謂的'meta'標籤一樣,現在不鼓勵。]](http://meta.stackexchange.com/q/10812) – 2010-11-07 23:39:40

+0

@Roger:謝謝!我錯過了那個備忘錄,只能看到它(另外!)在別處的另一個問題上,並認爲它一定是最好的做法。 – Ashe 2010-11-08 04:45:13

回答

2

列表解析快速和骯髒的解決方案。至於重複,你可以使用nub(從Data.List)或將結果轉換爲Data.Set並返回列表來刪除它們。

nub [(x,z) | (x,y) <- a, (y',z) <- b, y == y'] 

或與地圖。我們爲列表b創建輔助映射,其中value是列表中的值列表。然後爲每個需要的(x,z)對的每個(x,y)對列表構建(非零校驗)。其實我認爲你被卡住了,恰恰是因爲你沒有使用列表解析。 :)地圖/過濾器非常適合處理,但在列表理解方面,構建更容易理解。

let b' = M.fromListWith (++) [(k,[v]) | (k,v) <- b] 
nub . concat $ [[(x, z) | let t = M.lookup y b', t /= Nothing, z <- fromJust t] | (x,y) <- a] 
+0

第二部分工作正常,現在我將嘗試將它放在主體中,就像我之前在此示例中所做的一樣codepad.org/3YwhSTF4 – 2010-11-07 11:21:43

+0

您是否知道使用SCHEME編程語言解決相同的任務/問題? – 2010-11-07 11:23:17

+0

@弗洛裏安:以爲你不僅僅在尋找解決方案。 = \和沒有計劃。 – gorlum0 2010-11-08 09:14:33