传递字典并搜索一组值并在haskell中返回另一个字典

时间:2014-04-30 10:39:11

标签: haskell dictionary

我正在编写一个接受dictionaryarray 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也是错误

2 个答案:

答案 0 :(得分:2)

对于words中的每个单词,您希望在dict中找到所有这些条目,其第一部分等于该单词。

这可以直接使用列表理解来实现,使用wordsdict作为生成器,当前单词等于对的第一部分作为保护:

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需要多少个参数?