Haskell 仅保留在列表中多次出现的值

Haskell 仅保留在列表中多次出现的值,haskell,list-comprehension,Haskell,List Comprehension,例如,如果我有一个列表 comp :: Int -> Int -> Int -> [Int] comp xs a b = [ y | x <- xs, y <- (func x a b) ] 由于我的func的工作方式,comp通常会给我重复的值 i、 e.当传递一些任意的a和b时,我可能会得到comp=[1,2,2,3,3,4] 我的问题是:我是否有办法只保留列表中多次出现的值?因此,我得到的是comp=[2,3](因为2和3多次出现) 我知道在列表理解之外有很

例如,如果我有一个列表

comp :: Int -> Int -> Int -> [Int]
comp xs a b = [ y | x <- xs, y <- (func x a b) ]
由于我的
func
的工作方式,
comp
通常会给我重复的值

i、 e.当传递一些任意的
a
b
时,我可能会得到
comp=[1,2,2,3,3,4]

我的问题是:我是否有办法只保留列表中多次出现的值?因此,我得到的是
comp=[2,3]
(因为
2
3
多次出现)


我知道在列表理解之外有很多方法可以做到,但我想知道是否有可能在列表中做到。或者我甚至可以使用助手函数来完成此操作?

是的,在
组的帮助下:

import Data.List

onlyDupes xs = [x | x:_:_ <- group xs]
您可以将该逻辑集成到现有列表理解中,如下所示:

λ> onlyDupes [1,2,2,3,3,4]
[2,3]
comp xs a b = [ y | x <- xs, y:_:_ <- group (func x a b) ]

comp xs a b=[y | x我几乎可以肯定,单凭列表理解是无法做到这一点的,因为列表理解一次只能处理一个值。但我不会排除一些我不知道的方法。我一直在试图想出一个明智的答案,我一直在坚持列表的定义“在列表理解范围内”。请编辑代码以便
comp
的第一个参数类型为
[Int]
func
的括号在正确的位置。为什么在列表理解中这样做很重要?为什么要删除?我正要发布一个答案。很有趣……如果你和我一样好奇,想知道为什么没有引发非穷举模式异常,那么你可以检查。
comp xs a b = [ y | x <- xs, y:_:_ <- group (func x a b) ]