Элементы / кортежи порядка понимания списка Haskell - PullRequest
0 голосов
/ 07 мая 2018

В настоящее время я изучаю Хаскель и являюсь абсолютным новичком, когда дело доходит до ФП.

Сейчас я пробую разные вещи с использованием списка.

 listComprehension  = [(a,b,c) | a <- xs, b <- xs, c <- ys, even c, c == a+b] ++
                      [(a,b,c) | a <- xs, b <- xs, c <- ys, even c, c == a-b]
                      where xs = [1..4]; ys = [(-100)..100]

Так почему бы и нетскажем:

 listComprehension  = [(a,b,c) | a <- xs, b <- xs, c <- ys, even c, c == a+b || c == a-b]
                      where xs = [1..4]; ys = [(-100)..100]

?

Я хочу, чтобы элементы были упорядочены точно так же, как в моем первом примере.Я хочу, чтобы все элементы, где c = a + b, а затем все элементы, где c = ab.

Обратите внимание, что в моем втором коде порядок не тот, который я хотел бы иметь.Я не могу понять, как я упорядочиваю вещи в понимании списка, особенно когда у меня есть кортежи ..

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Ранее я использовал альтернативные функции ([четные, нечетные]) в списках. Я не всегда был уверен, что они были наиболее эффективными. Недостаток, как я увидел, заключался в том, что они делали два или более проходов по списку источников. Для этого я выбрал другой подход, однако эффективность не очень важна для небольших наборов данных.

Это то, что я написал

lc xs ys = [[(a,b,c)|(a,b,c)<-ls,c==a+b] ++ [(a,b,c)|(a,b,c)<-ls,c==a-b]]
           where ls = [(a,b,c)| a<-xs, b<-xs, c<-ys, even c]

Это было быстрее, чем ваша первоначальная функция, и быстрее, чем другой ответ. Что было более поразительно, так это то, что он использовал гораздо меньше памяти, чем любой.

Одно дело выбирать значения из длинного списка, а другое - просто устанавливать их из сгенерированных значений.

lc xs = [(a,b,c)|a<-xs,b<-xs,c<-[(a-b),(a+b)],even c]
partition (\(a,b,c) -> c == a+b) lc [1..4]
0 голосов
/ 07 мая 2018

Выбор между функциями (+),(-) в первом генераторе.

listComprehension =
   [(a,b,c) | f <- [(+),(-)], a <- xs, b <- xs, c <- ys, even c, c == f a b ]
   where xs = [1..4]; ys = [(-100)..100]

Кстати, это неэффективный подход. Вместо того, чтобы пытаться каждый c <- ys, мы должны вместо let c = f a b, а затем проверить, -100 <= c && c <= 100 (и равномерность). Таким образом, мы делаем код примерно в 200 раз быстрее.

...