我正在编写一个接受dictionary
和array of keys
的代码并检查字典,看看该字符是否在字典中,如果不存在,则返回键在词典中的那些键和值的字典
我戴了代码但是我收到了太多错误
let x = check dict key
putStrLn $ show (x)
check :: Eq k => [(k, v)] ->[k] -> [(k,v)]
check dict words = [findVal word dict | word <- words]
findVal :: (Eq k) => k -> [(k,v)] -> [(k, v)]
findVal key xs = foldr (\(k,v) acc -> case key == k of True -> (k,v)
False -> acc) xs
错误是2个函数的数据类型和cse也是错误
答案 0 :(得分:2)
对于words
中的每个单词,您希望在dict
中找到所有这些条目,其第一部分等于该单词。
这可以直接使用列表理解来实现,使用words
和dict
作为生成器,当前单词等于对的第一部分作为保护:
check dict words = [ e | key <- words, e@(k, _) <- dict, key == k ]
以下示例演示了双生成器列表理解的工作原理:
> [(a, b) | a <- "abc", b <- [1..5]]
[('a',1),('a',2),('a',3),('a',4),('a',5),('b',1),('b',2),('b',3),('b',4),('b',5),('c',1),('c',2),('c',3),('c',4),('c',5)]
并说明为什么它正是你所需要的。
答案 1 :(得分:1)
\(k,v) acc -> case key == k of True -> (k,v)
False -> acc
这个功能的类型是什么?
foldr (...) xs
foldr
需要多少个参数?