迭代两个列表 Haskell

Iterate two lists Haskell

我有这个功能:

applyRel :: (Eq k) => k -> (BinaryRelation k v) -> [v] 
applyRel key list = [ v | (k,v)<-list, key==k]

它需要一个字符串,k 和 returns 所有具有给定 k 的 v:

applyRel "bar" bar_stuff

会输出

["mitzva", "stool", "tender", "keeper"]

它可以工作,但是如果它接受一个字符串列表和另一个列表怎么办。 我可以做一些类似列表递归的事情吗?它遍历一个列表,并为每个项目遍历第二个列表。有点像 C 中的双重 for 循环。

这就是我的目标:

applyToList :: [k] -> (BinaryRelation k v) -> [v]
applyToList [] list = []
applyToList keys list = 
     do key <- keys
        applyRel key list

如果您将 Eq k 约束添加到 applyToList:

,您的代码就可以正常工作
applyToList :: Eq k => [k] -> BinaryRelation k v -> [v]
applyToList keys list = do
    key <- keys
    applyRel key list

您也可以省略 [] 上的模式匹配。它的工作示例:

> let bar_stuff = [("bar", "mitzva"), ("bar", "stool"), ("bar", "tender"), ("bar", "keeper"), ("salad", "bar"), ("foo", "bar")]
> applyToList ["salad", "bar"] bar_stuff
["bar","mitzva","stool","tender","keeper"]

或者您可以只使用 concatMap,无论如何在 Monad 的实例中用于列表:

applyToList :: Eq k => [k] -> BinaryRelation k v -> [v]
applyToList keys list = concatMap (flip applyRel list) keys