구문 설탕을 사용하여 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 ]