我有这个函数:
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