使用语法糖检查 Haskell 中集合中的所有元素

Checking for all Elements in a Set in Haskell using syntactic sugar

我尝试删除 (String, Int) 列表的整数重复项,我保证没有 String 重复项。

是否可以在 Haskell 中评估类似的东西:

我试过了:

[(a,b) | (a,b) <- bs, (c,k) <- bs, ((k == b) <= (a == c))]

但这还行不通。

编辑:我很清楚,您可以使用更复杂的语法来实现。例如,通过递归搜索每个元素重复的列表...

(注意:这是此答案的全新版本。之前的版本完全偏离了基础。)

为了更准确地理解您的数学集合,我们可以将您答案中的定义调​​整为

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]]

“对于 bs 中的所有 (c,d) 使得 d==b 它遵循 c==a”。

uniquesOnly [(1,1),(2,2),(3,1)] returns [(2,2)].

这是一个可能的解决方案:

例如,我编写了这个等效语句:

removeDuplicates ::  [(String, Int)] -> [(String, Int)]
removeDuplicates bs = 
   [(a,b) | (a,b) <- bs, 
            length [(c,d) | (c,d) <- bs, d == b] == 1]

但这不是同一个语句,只是一个相等的语句。

现有答案没有利用字符串唯一性保证或 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 ]