使用列表搜索列表列表

时间:2014-11-24 01:32:14

标签: haskell

我对一些列表中的字符串理解列表有点麻烦。在下面的代码中,我有一个名为字典的字符串列表(我们可以将其视为全局用于我们的目的)和一个搜索字符串列表,它是输入。代码在这里:

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 

我要做的是搜索双重列表,&#39;词典&#39; /&#39; z&#39;对于列表中的每个字符串&#39; a&#39;然后返回包含该字符串的完整列表。因此字典可能包含[[&#34; b&#34;,&#34; c&#34;],[&#34; d&#34;,&#34; e&#34;],[&# 34; f&#34;,&#34; g&#34;]]并列出&#39; a&#39;可能包含[&#34; b&#34;,&#34; d&#34;]并且我会回来[[&#34; b&#34;,&#34; c&#34;],[& #34; d&#34;&#34; E&#34;]]。 谢谢!

1 个答案:

答案 0 :(得分: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

其中gogo :: Eq a => a -> [[a]] -> [[a]]

类型的辅助函数

go函数负责查找仅包含x的所有列表。 search函数负责迭代列表xs并连接所有go次调用的结果。