使用语法糖检查 Haskell 中集合中的所有元素
Checking for all Elements in a Set in Haskell using syntactic sugar
我尝试删除 (String, Int)
列表的整数重复项,我保证没有 String
重复项。
是否可以在 Haskell 中评估类似的东西:
&space;|&space;(a,b)&space;%5Cin&space;S:&space;%5Cforall&space;(c,d)&space;%5Cin&space;S:&space;b&space;=&space;d&space;%5Cimplies&space;a&space;=&space;c%5C%7D)
我试过了:
[(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 ]
我尝试删除 (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 ]