Сохраняйте значения, которые появляются более одного раза, в пределах понимания списка - PullRequest
3 голосов
/ 20 апреля 2020

Например, если у меня есть понимание списка

comp :: Int -> Int -> Int -> [Int]
comp xs a b = [ y | x <- xs, y <- (func x a b) ]

, где func - это просто функция

func :: Int -> Int -> Int -> [Int]
func x a b
   | (x == a || x == b  = [a,b]
   | otherwise          = filter (/=a) [a,b])

comp, как правило, дает мне повторяющиеся значения из-за как мой func работает.

то есть я могу получить comp = [1,2,2,3,3,4] при прохождении произвольных a и b.

Мой вопрос: Есть ли способ, которым я могу только сохранить значения в этом списке, которые появляются более одного раза в пределах списка понимания ? Так что вместо этого я получаю comp = [2,3] (поскольку 2 и 3 появляются более одного раза).

Я понимаю, что есть много способов сделать это вне понимания списка, но я хочу знать, возможно ли сделать это внутри. Или я мог бы даже использовать вспомогательную функцию для этого?

1 Ответ

4 голосов
/ 20 апреля 2020

Да, с помощью group:

import Data.List

onlyDupes xs = [x | x:_:_ <- group xs]

Это работает так:

λ> onlyDupes [1,2,2,3,3,4]
[2,3]

Вы можете интегрировать эти логики c в существующее понимание списка, например this:

comp xs a b = [ y | x <- xs, y:_:_ <- group (func x a b) ]

Примечание: если ваши значения не всегда сортируются, как в вашем примере, вам нужно будет использовать (group . sort) вместо просто group.

...