迭代两个列表 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
我有这个功能:
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