2014-06-06 2 views
-1

안녕하세요, 하스켈의 인수로 목록을 분할해야합니다. 이런 기능을 찾았습니다목록 내에서 목록 분할하기 haskell

group :: Int -> [a] -> [[a]] 
group _ [] = [] 
group n l 
    | n > 0 = (take n l) : (group n (drop n l)) 
    | otherwise = error "Negative n" 

하지만 나누고 싶은 목록이 다른 목록에 포함되어 있다면 어떻게 될까요? 예를

를 들어

group 3 [[1,2,3,4,5,6],[2,4,6,8,10,12]] 

그렇게 할 수있는 방법이 있습니까

[[[1,2,3],[4,5,6]],[[2,4,6],[8,10,12]]] 

반환해야?

답변

0

이 원하는 : 은 사양 복용을 반복하고 여기 삭제가 포함 감안할 때

group n = map (toList . splitAt n) 
    where 
    toList (x,y) = [x,y] 

UPDATE있어 나는 그것을 할 것입니다 방법 :

import Data.List (unfoldr) 
import Data.Maybe (listToMaybe) 

group :: Int -> [[a]] -> [[[a]]] 
group n = map (unfoldr split) 
    where 
    split = (\s -> listToMaybe (fst s) >> Just s) . splitAt n 

당신은 여기에 그 안에 알 수 있습니다 또한 의 정의는 group으로 구현되었습니다. unfoldr split입니다.

+0

이 기능은 별도의 목록이 아닙니다 매 n 요소 요소의 N 걸립니다. 이와 같이 [[[1,2,3], [4,5,6,7,8,9]]] [[[1,2,3], [4,5,6], [7,8,9]]] – user3713267

+0

테스트 케이스가 명확하지 않은 경우 ... (이 테스트 케이스를 답안에 추가하십시오, 답변을 업데이트 할 것입니다). – amnn

3

그냥 그 목록의 요소 (목록)를 통해 map을 수행

grouplists :: [[a]] -> Int -> [[[a]]] 
grouplists input n = map (group n) input 
+0

유형 오류로 인해 구현하는 데 문제가 있습니다 – user3713267

+0

어떤 유형의 오류가 있습니까? – Manu343726