シンタックスシュガーを使用して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 ]