나는 전에서 후 상태로 얻으려고 노력하고 있습니다. 목록에서 중복 된 튜플을 제거하는 편리한 Haskell 함수가 있습니까? 아니면 전체 목록을 반복하는 것과 같이 조금 더 복잡한 것일까 요?
Before: the list of tuples, sorted by word, as in
[(2,"a"), (1,"a"), (1,"b"), (1,"b"), (1,"c"), (2,"dd")]
After: the list of sorted tuples with exact duplicates removed, as in
[(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]
검색 Eq a => [a] -> [a]
에 hoogle , 반환 nub
기능 :
nub 함수는 목록에서 중복 요소를 제거합니다. 특히 각 요소의 첫 번째 발생 만 유지합니다. (이름 nub은 '본질'을 의미합니다.)
문서에서와 같이보다 일반적인 경우는 nubBy
.
즉, 이것은 O(n^2)
알고리즘이며 매우 효율적이지 않을 수 있습니다. 대안은 다음과 Data.Set.fromList
같이 값이 Ord
유형 클래스 의 인스턴스 인 경우 사용 하는 것 입니다.
import qualified Data.Set as Set
nub' :: Ord a => [a] -> [a]
nub' = Set.toList . Set.fromList
이것은 원래 목록의 순서를 유지 하지 않습니다 .
원래 목록 의 순서 를 유지 하는 간단한 세트 스타일 솔루션 은 다음과 같습니다.
import Data.Set (Set, member, insert, empty)
nub' :: Ord a => [a] -> [a]
nub' = reverse . fst . foldl loop ([], empty)
where
loop :: Ord a => ([a], Set a) -> a -> ([a], Set a)
loop acc@(xs, obs) x
| x `member` obs = acc
| otherwise = (x:xs, x `insert` obs)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다