haskell - 哈斯克尔。两个列表的 INNER JOIN
问题描述
我一直在问谷歌并试图找到必要的工具来做到这一点,但似乎无法找到解决我的问题的方法。整个任务是使用字典来翻译列表并仅保留唯一值。例如以下输入:
dict = [("a", "aa"), ("b", "bb")]
list1 = ["a","b","c","a","a","g"]
应该产生以下输出:
result = ['aa', 'bb']
这是我到目前为止所困的地方:
main = do
let dict = [("a", "aa"), ("b", "bb")]
let list1 = ["a","b","c","g"]
let keys = map fst dict
let values = map snd dict
let result = replace keys values list1
print(result)
产生
["aa","bb","c","g"]
所以为了解决这个问题,我在想可能有一种方法可以使用filter
或以map
某种foldl
方式进行内部连接,如下所示:
let result = innerJoin values result
目前我有一些看起来像这样的东西:
innerJoin :: (Eq a) =>[a] -> [a] -> [a]
innerJoin xs [] = xs
innerJoin [] ys = ys
innerJoin (x:xs) (y:ys) = if (elem x (y:ys))
then x: innerJoin xs ys
else innerJoin xs ys
main = do
let dict = [("a", "aa"), ("b", "bb")]
let list1 = ["a","b","c","g"]
let keys = map fst dict
let values = map snd dict
let list2 = innerJoin keys list1
let result = replace keys values list2
print(result)
但它返回["aa","bb","c","g"]
而不是预期的 ["aa","bb"]
。最后我打算用 来完成它nub
,但我正在努力找出 innerJoin 部分。
编辑:
感谢下面的答案,这里是问题的解决方案:
innerJoin xs [] = []
innerJoin [] ys = []
innerJoin (x:xs) (y:ys) = if (elem x (y:ys))
then x: innerJoin xs ys
else innerJoin xs ys
catMaybes ls = [x | Just x <- ls]
genList x [] = []
genList [] y = []
genList x (y:ys) = lookup y x: genList x ys
func dict list = do
let keys = map fst dict
let list1 = innerJoin keys list
catMaybes (genList dict list1)
test1 = func [("a", "aa"),("e", "bb")] ["a","b","c","g","a"]
test2 = func [(1,11),(2,11),(4,44)] [1,2,3,1,2]
解决方案
你想要的功能是lookup
. 例如:
lookup "a" [("a", "aa"), ("b", "bb")] = Just "aa"
lookup "b" [("a", "aa"), ("b", "bb")] = Just "bb"
lookup "x" [("a", "aa"), ("b", "bb")] = Nothing -- "x" is not in the list
在这里有用的另一个功能是Data.Maybe.catMaybes
:如果您有一个喜欢[Just 1, Just 2, Nothing, Just 3, Nothing]
并应用catMaybes
到它的列表,您会得到[1, 2, 3]
. 所以你可以结合起来lookup
得到catMaybes
你catMaybes $ map (flip lookup dict) list1
想要的解决方案。另一个改进是要注意Data.Maybe
定义mapMaybe f xs
为等效于catMaybe (map f xs)
,因此您可以将其简化为mapMaybe (flip lookup dict) list1
。
推荐阅读
- docker - Nginx 缓存 DNS 查找并忽略我的解析器设置
- python - Need help understanding classes in Python
- deployment - Wix Toolset- create updater
- azure-active-directory - Sign-in alerts for Azure AD users
- python - 使用 python/beautiful soup 为 Kodi 插件从网站抓取链接
- jquery - 在 jsViews 模板中启用按钮
- https - letsencrypt 公开记录的 ips 在哪里?
- json - Azure Sql 数据仓库上的 JSON_VALUE:“JSON_VALUE”不是可识别的内置函数名称
- python - 从日期时间列按时间选择熊猫
- java - 由于代理/内联网限制,在 Eclipse 中创建 Maven 项目时出错