2014-09-18 3 views
1

У меня есть этот список понимание:фильтр в списке понимание в Haskell

[(x,y)| x<-[1..2], y<-[x..3], let z = x+y, odd z] 
  1. Право результат [(1,2), (2,3)], но я не могу понять, почему , Что такое фильтр «let z = x + y, odd z» делать? В другом коде нет «z», поэтому я не могу понять, почему это что-то меняет.
  2. Может кто-нибудь объяснить, шаг за шагом, что здесь происходит.

Большое спасибо!

+6

Если это помогает думать так: '[(x, y) | x <- [1..2], y <- [x..3], нечетное (x + y)] '. – karakfa

+0

'для x в [1,2]: для y в диапазоне (x, 4): z = x + y; if (нечетное (z)): yield (x, y) '. –

ответ

5

Так х идет от 1 до 2, а у от х до 3.

Таким образом, для первого:

x = 1 
y = 1 
z = 1 + 1 = 2 

г не странно, следовательно, он не добавляется. Тогда:

г теперь нечетным, так что он будет добавлен. Тогда:

x = 1 
y = 3 
z = 1 + 3 = 4 

г даже, следовательно, не добавляется. После этого:

x = 2 
y = 2 
z = 2 + 2 = 4 

z есть.

Тогда:

x = 2 
y = 3 
z = 2 + 3 = 5 

г 5, нечетное, поэтому добавили.

2

Вы генерируете кортежи, где сумма их элементов должна быть нечетным числом. Линия:

let z = x+y, odd z 

дает имя z на сумму x + y, это значение затем используется с предикатом odd, чтобы проверить, если сумма на самом деле странно. Комбинации x и y, для которых odd z оценивает True, попадает в список результатов, другие удаляются.

Обратите внимание, что наименьшее значение для y коллекции фактическое значение переменной x:

x <- [1..2] 
y <- [x..3] 

Это, чтобы удалить некоторые «дубликаты» ((2,1)) из рассмотрения.

Смежные вопросы