Фильтрация по предикату, который принимает 2 аргумента - PullRequest
0 голосов
/ 03 декабря 2018

То, что я хочу, в основном, будет O (n ^ 2) итерацией по списку.Допустим, у меня есть список из двух целых чисел:

let list = [2312, 8000, 3456, 7000, 1234]

и функция, позволяющая проверить, приведет ли сложение двух целых чисел к результату, превышающему 20000 (это может быть произвольная функция, которая принимает два целых числа и возвращаетboolean).

myPredicate :: Int -> Int -> Bool
myPredicate x y = x + y > 10000

Есть ли способ применить этот предикат к приведенному выше списку, чтобы получить список списков, содержащих допустимые пары, например:

>> filter myPredicate list
>> [[2312, 8000], [3456, 8000], [3456, 7000], [8000, 7000]]

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Если я вас правильно понял, вы хотите построить список пар,

pairs xs = [(y,z) | (y:ys) <- tails xs, z <- ys]

, а затем отфильтровать его, используя свой предикат, который должен быть в необработанной форме,

myPredicate' :: (Int,Int) -> Bool
myPredicate' x y = x + y > 10000

Итак,

filter myPredicate' (pairs list)

или эквивалентно

filter (uncurry myPredicate) (pairs list)
0 голосов
/ 03 декабря 2018

Это напрямую поддерживается синтаксисом Haskell.

[(x, y) | x <- myList, y <- myList, x + y > 20000]

Возвращает парные и повторные пары.Если это не то, что вам нужно, рассмотрите следующие понятия списка:

[(x, y) | x <- myList, y <- myList, x < y, x + y > 20000] -- no reversed pairs, no repeats

[(x, y) | x <- myList, y <- myList, x <= y, x + y > 20000] -- repeats, no reversed pairs

Если по какой-то неизвестной науке причине у вас есть список с дублирующимися элементами, скажем [30000,30000] , и вам нужны только элементы с разнымипозиции для формирования правильных пар , тогда это простое понимание списка не сработает.Я понятия не имею, что за проблема реальной жизни потребует этого, но вот вы:

[(y,z) | (y:ys) <- tails xs, z <- ys, y + z > 20000]

(идея, украденная из другого ответа)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...