2013-03-14 2 views
2

저는 하스켈에 다소 익숙하며리스트의 모든 인접한 서브리스트를 생성하려고합니다. 리스트의 모든 인접한 하위리스트 생성하기

listSublists :: [a] -> [[a]] 
listSublists []  = [[]] 
listSublists xs  = [xs] ++ listSublists (init xs) 

내가 위의 기능이 제거 마지막 요소와 하위 목록을 생성 할 알고하지만 난 내 의사를 완료하는 방법을 모르고도 없어 :

I 전류는 다음이있다. 내 의사는 기본적으로

,

꼬리를 제거, 전체 목록을 가져 가라. [1,2,3] 는 [XS] ++ listSublists (INIT XS)를 생성 할 listSublists

, XS로의 = 1,2,3,4 (XS X)의 XS 합격 ], [1,2,3], [1,2], [1], [] 그리고 목록을 다 쓸 때까지 [2,3,4]를 xs로 전달하면서 계속하려고합니다.

누군가가 내게 몇 가지 포인터를 줄 수 있습니까? 아니면 완전히 잘못된 생각으로 생각하고 있습니까?

답변

4

기능이 inits 기능과 거의 동일합니다. 현재 올바른 목록에 있습니다. 주어진 목록의 접두사를 모두 개까지 나열 할 수 있습니다.

"목록의 하위 목록은 무엇입니까?" 하나의 대답은 은 목록 접두어의 접미사입니다 (즉, 목록의 일부를 잘라낸 다음 해당 목록의 앞쪽에있는 일부 요소를 잘라내어 인접한 하위 목록 중 하나가 있음)).

prefixes이있는 경우 주어진 접두어 (즉, 일부 목록)의 접미사를 모두 개 생성하는 방법을 원합니다. 그래서, 경우에 당신은 내가 ???에 사용하는 것을 알아 내기 위해 당신에게 그것을 떠나

prefixes :: [a] -> [[a]] 
prefixes []  = [[]] 
prefixes xs  = [xs] ++ prefixes (init xs) 

당신은 또한 해당 기능을 suffixes

suffixes :: [a] -> [[a]] 
suffixes []  = [[]] 
suffixes xs  = [xs] ++ suffixes (??? xs) 

을 할 수 있습니다. 이 두 기능으로, 당신은 단지 모든 연속 하위 목록

allSublists :: [a] -> [[a]] 
allSublists = concat . map suffixes . prefixes 

당신은 결과 집합에있을 것이다 빈 목록을 모두 제거 할 수 있습니다를 얻기 위해 모든 접두사를 가지고 가고, 을 모든 접미사를 생산 , 그들은 그 사건의 흥미로운되지 않습니다.

+0

감사합니다.나는 꼬리를 사용하는 것을 알고있다라는 것을 알고있다? 하지만 나는 실제로 '연결'을 얻지 못합니다. 지도 접미사. 접두사 부분. 제대로 쓰는 법에 대해서는 잘 모르겠습니다. – rlhh

+0

@ user1043625 무슨 뜻인지 모르겠다. 그것이 당신이 그것을 쓰는 방법입니다. 목록 기능을 작성하는 방법을 알고 싶지 않은 경우. 그렇지 않으면 함수의 조합 일뿐입니다. – sabauma

+0

나는 당신의 대답의 일부를 잘못 이해했다고 생각하지만, 나는 그것을 알아 냈다고 믿는다. 나는 실제로 그것을 다른 방식으로하고있다. 'listSuffix (xs) ++ listPrefix (init xs)'입니다. 이제 빈 목록의 중복을 제거하는 방법을 찾아야합니다. – rlhh

0

(반드시 연속) 모든 하위 목록 :

sublists [] = [[]] 
sublists (x:xs) = [x:sublist | sublist <- sublists xs] ++ sublists xs 

만 연속 하위 목록 : 대답에 대한

nub $ concat $ map tails $ inits ls 

또는

(:) [] $ filter (\x -> length x /= 0) $ concat $ map tails $ inits ls