我对Haskell非常感兴趣,目前正试图解决这个问题。
要解决此问题,必须输出与列表A中的(x,y)匹配的列表C(x,z)和列表B中的(y,z)(不重复)y在A和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
目前被困......帮忙?
答案 0 :(得分:2)
列出理解快速而肮脏的解决方案。对于重复项,您可以使用nub(来自Data.List)或将结果转换为Data.Set并返回列表来删除它们。
nub [(x,z) | (x,y) <- a, (y',z) <- b, y == y']
或者使用地图。我们为列表b创建辅助映射,其中value是列表中的值列表。然后只为每个(x,y)对所需(x,z)对的列表构建(使用非零检查)。实际上我认为你被卡住了,因为你没有使用列表推导。 :)地图/过滤器非常适合处理,但在列表推导方面更容易理解构建。
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]