迭代两个列表Haskell



我有这个函数:

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

它取一个字符串k,并返回给定k:的所有v

applyRel"bar"bar_stuff

将输出

["成年礼"、"凳子"、"温柔"、"守护者"]

它是有效的,但如果它包含一个字符串列表和另一个列表呢。我可以做一些类似列表递归的事情吗?它遍历一个列表,对每个项目遍历第二个列表。有点像C.中的双循环

这就是我要做的:

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

最新更新