구문 설탕을 사용하여 Haskell에서 집합의 모든 요소 확인
Nov 21 2020
중복 (String, Int)
이 없음을 보장 하는 목록의 정수 중복을 제거하려고합니다 String
.
Haskell에서 다음과 같이 평가할 수 있습니까?
나는 시도했다 :
[(a,b) | (a,b) <- bs, (c,k) <- bs, ((k == b) <= (a == c))]
그러나 이것은 아직 작동하지 않습니다.
편집 : 더 복잡한 구문을 사용하여 달성 할 수 있다는 것을 잘 알고 있습니다. 예를 들어 각 요소 중복에 대한 목록을 재귀 적으로 검색하여 ...
답변
2 WillNess Nov 21 2020 at 10:53
(주의 : 이것은이 답변의 완전히 새로운 버전입니다. 이전은 완전히 근거가 없습니다.)
수학적 집합 이해를 더 가깝게 따르기 위해 답변의 정의를 다음과 같이 조정할 수 있습니다.
uniquesOnly :: (Eq a, Eq b) => [(a, b)] -> [(a, b)]
uniquesOnly bs =
[(a,b) | (a,b) <- bs,
[(c,d) | (c,d) <- bs, d == b] ==
[(a,d) | (c,d) <- bs, d == b]]
"d == b가되는 bs의 모든 (c, d)에 대해 c == a".
uniquesOnly [(1,1),(2,2),(3,1)]
를 반환합니다 [(2,2)]
.
1 Niclas Nov 23 2020 at 17:02
이것은 가능한 해결책입니다.
예를 들어 다음과 같은 동등한 진술을 작성했습니다.
removeDuplicates :: [(String, Int)] -> [(String, Int)]
removeDuplicates bs =
[(a,b) | (a,b) <- bs,
length [(c,d) | (c,d) <- bs, d == b] == 1]
그러나 이것은 동일한 진술이 아니라 동일한 진술입니다.
1 dfeuer Nov 23 2020 at 22:21
기존 답변은 문자열이 고유하다는 보장이나 Int
정렬 된 사실을 활용하지 않습니다 . 여기에 있습니다.
import Data.List (sortBy, groupBy)
import Data.Function (on)
uniquesOnly :: Ord b => [(a, b)] -> [(a, b)]
uniquesOnly ps
= [ p
| [p] <- groupBy ((==) `on` snd) .
sortBy (compare `on` snd) $ ps ]