2014-11-24 42 views
0

我在列表中列出了一些列表的字符串理解时遇到了一些麻烦。在下面的代码中,我有一个名为dictionary的字符串列表(我们可以认为它是全局的)以及搜索字符串列表,它是输入。该代码是在这里:正在搜索带有列表的列表的列表

simpleSearch :: [String] -> [[String]] 
simpleSearch a = [z | z <- dictionary, elem a z] 

早些时候我试图创建如上文所描述的是基于zipWith代码做搜索的搜索,但没有骰子:

search' :: [a] -> [[a]] -> [[a]] 
search' _ [] = [] 
search' [] _ = [] 
search' (x:xs) (y:ys) 
    | elem x y = x : search' x ys 
    | otherwise = search' xs ys 

我试图要做的是在列表'a'的每个字符串中搜索双列表'dictionary'/'z',然后返回包含该字符串的完整列表。所以字典可能包含[[“b”,“c”],[“d”,“e”],[“f”,“g”]]和列表'a'可能包含[“b”,“ d“],我会回来[[”b“,”c“],[”d“,”e“]]。 谢谢!

+0

那么,你的问题到底是什么? – leftaroundabout 2014-11-24 01:44:57

回答

1

您的问题就在这里:

... 
    | elem x y = x : search' x ys 
    | otherwise = search' xs ys 

在您所呼叫search'x并与xs第二种情况下,第一种情况。但是xxs有不同的类型 - xsx的列表。

你需要构建迭代是这样的:

search :: Eq a => [a] -> [[a]] -> [[a]] 
search [] _ = [] 
search (x:xs) ys = (go x ys) ++ search xs ys 

其中go的类型是go :: Eq a => a -> [[a]] -> [[a]]

go功能是负责寻找一切只包含x名单中的一个辅助功能。 search函数负责遍历列表xs并连接所有go调用的结果。