2014-11-24 3 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'의 각 문자열에 대해 '사전'/ 'z'라는 이중 목록을 검색 한 다음 문자열이 들어있는 전체 목록을 반환하는 것입니다. 따라서 사전에는 [[ "b", "c"], [ "d", "e"], [ "f", "g"]] d "] 그리고 나는 [["b ","c "], ["d ","e "]]로 돌아갈 것이라고 말했다. 감사합니다.

+0

그럼 정확히 무엇이 문제입니까? – leftaroundabout

답변

1

당신의 문제는 여기에 있습니다 : 당신이 xxs와 두 번째 경우에 search'를 호출하는 첫 번째 경우에

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

. 그러나 xxs은 다른 유형이 있습니다. xsx의 목록입니다.

는이 같은 반복을 구성해야합니다 go 유형 go :: Eq a => a -> [[a]] -> [[a]]

go 기능은 단지 x를 포함하는 모든 목록을 찾기위한 책임의 도우미 함수입니다

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

. search 함수는 목록 xs을 반복하고 모든 go 호출의 결과를 연결합니다.