당신은 당신의 이름 선택에 의해 암시 의미가 산만하지, 하나의 문자 변수를 사용하여 코드에서 숨겨진 구조를 밝히기 위해서 자신을 도움이 될 것이다 :이 작업을 조금 부 자연스러운
g :: (Eq a) => [[(a, b)]] -> [(a, [b])]
g alists = uncurry zip $ foldl (foldl f) ([], []) alists
where
f ([], []) (k, v) = ([k], [[v]])
f ((h:t), (u:s)) (k, v)
| k == h = (h:t, (v:u):s)
| otherwise = (h:q, u :r) where (q, r) = f (t, s) (k, v)
-- ((h:) *** (u:)) $ f (t,s) (k,v)
중간 데이터를 unzip
에 넣고 출력을 위해 다시 핑합니다. zip
.그에 대한 필요, 우리는 출력으로 임시 데이터의 동일한 유형의 작업을 할 수 없습니다 : f
가하는 paramorphism를 "삽입"의 일종이라고 지금은 분명하다
g2 :: (Eq a) => [[(a, b)]] -> [(a, [b])]
g2 alists = foldl (foldl f) [] alists
where
f [] (k, v) = [(k,[v])]
f ((a,b):t) (k, v)
| k == a = (a,v:b):t
| otherwise = (a,b):f t (k,v)
을
f xs (k, v) = para (\(a,b) t r -> if a==k then (a,v:b):t
else (a, b):r)
[(k,[v])] xs
para c z [] = z
para c z (x:t) = c x t $ para c z t
foldl (foldl f) [] alists === foldl f [] $ concat alists
그것은 (Ord a)
제약으로 전환 할 수있는 경우와, 그 효율은 향상 f
재 구현 될 수
g3 :: (Ord a) => [[(a, b)]] -> [(a, [b])]
g3 = foldl f [] . concat
where
f xs (k, v) = para (\(a,b) t r -> if k < a then (k,[v]):(a,b):t
else if a==k then (a,v:b):t
else (a, b):r)
[(k,[v])] xs
는
g4 :: (Ord a) => [[(a, b)]] -> [(a, [b])]
g4 alists = foldt u []
. map (map (\(a,b) -> (a,[b])) . sortBy (comparing fst))
$ alists
where
u xs [] = xs
u [] ys = ys
u [email protected]((a,b):t) [email protected]((c,d):r) = case compare a c of
LT -> (a,b) : u t ys
EQ -> (a,b++d) : u t r
GT -> (c,d) : u xs r
foldt f z [] = z
foldt f z [x] = x
foldt f z xs = foldt f z $ pairwise f xs -- tree-like folding
pairwise f (a:b:t) = f a b : pairwise f t
pairwise f xs = xs
comparing
는
Data.Ord
에서, 우리는
the other route합니다 (
concat
보다) 이동 및 병합의 트리를 통해 입력 목록에 가입 할 수 있습니다, 더이 코드의 복잡성을 향상시킬 수 있습니다. 데이터 조각이 이미 정렬 된 경우 (시나리오에서 가능성이 있음) 추가 알고리즘 이득을 위해
sortBy
부분을 생략 할 수 있습니다. 따라서이 버전은 일종의
mergesort
입니다 (정렬없이 병합 만 가능).
이 함수는 인식 할 수 없지만'transpose'는 이미 다른 것입니다. –
정확히이 기능을 수행하기를 원하십니까? 당신의 구현은 'transpose [[(1,2), (2,3)], [(4,5), (6,7)], [(4,10)] == [(1, [2 ]), (2, [3]), (4, [10,5]), (6, [7])]'그냥'concat'을 수행 한 다음'groupBy'를 수행하고 두 번째 요소. 당신은 확실히 당신이 가지고있는 것보다 훨씬 더 간단하게 쓸 수 있습니다,하지만 나는 그것이 이미 존재하는지 의심 할 것입니다. – bheklilr