Там два основных подхода к делать это в Haskell.
- Генерация потока кортежей, которые удовлетворяют constaints вы в списке, но не обязательно возвращает истину в соответствии с функцией
- Использование
filter
к номиналу вниз по списку
Или мы можем попытаться избежать генерируя все эти избыточные данные и просто имеет что-то вроде
- Используйте наши знания о предикате только для генерации потока правильных кортежей в первую очередь
Поскольку мы работаем с произвольной функцией, мы не можем сделать вторую, поэтому мы предпочтем первое. Таким образом, мы начинаем с создания всех наборов, удовлетворяющих константам 1 <= a < a + c <= n
и 1 <= b < b + d <= m
.
Теперь ясно, что a
находится в диапазоне [1 .. n]
и b
находится в [1 .. m]
. Кроме того, для каждого a
мы можем иметь c
в [a + 1 .. n - a]
, и для каждого b
мы можем иметь [b + 1 .. m - b]
. Мы будем использовать Haskell's list comprehensions для кодирования это очень эффектный способ
allTuples :: Int -> Int -> [(Int, Int, Int, Int)]
allTuples n m = -- First we take in n, m
[(a, b, c, d) |
a <- [1 .. n],
b <- [1 .. m],
c <- [a + 1 .. n - a],
d <- [b + 1 .. m - b]]
Вот эти <-
будут делать правильные вещи, и принять все возможные комбинации. Дальше все, что нам нужно, это использовать filter
для удаления элементов.
prune :: Grid -> [(Int, Int, Int, Int)] -> [(Int, Int, Int, Int)]
prune grid tuples = filter (\t -> f grid t) tuples
-- could have written:
-- prune grid = filter (f grid)
-- prune = filter . f
Тогда мы можем склеить их вместе, но я оставлю это последний шаг к вам, потому что я не знаю, как вы будете использовать его в своем приложении. Вы также можете объединить эти шаги в единое понимание списка:
allTuples :: Int -> Int -> [(Int, Int, Int, Int)]
allTuples n m = -- First we take in n, m
[(a, b, c, d) |
a <- [1 .. n],
b <- [1 .. m],
c <- [a + 1 .. n - a],
d <- [b + 1 .. m - b],
f grid (a, b, c, d)]
Это звучит как работа для понимания списка. Вы узнали о них еще? – dfeuer
У меня действительно, но я использовал их только в простых ситуациях, когда повторяется только одна переменная.Как я могу сделать это с помощью 4 разных переменных, также имея в виду, что мне нужно проверить каждую возможность (так, не только (1,1,1,1), (2,2,2,2), но (3, 4,1,2), а также (4,3,1,2) для примера), и мне также необходимо указать где-то условия, изложенные в моем первоначальном посте. – Naleg