fibs = 1:1:[x+y|x <- fibs, y <- tail fibs]
возвращается
[1,1,2,3,4,5,6,7,8,9]
fibs = 1:1:[x+y|(x, y) <- zip fibs (tail fibs)]
возвращается
[1,1,2,3,5,8,13,21,34,55...]
О, я понял. спасибо!
хороший вопрос. вы могли бы даже написать второй эквивалентно как fibs = 1:1: [ x+y | x <- fibs | y <- tail fibs]
. здесь используется расширение ParallelListComp (для понимания параллельных списков).
Первый оценивает декартово произведение (то есть каждую комбинацию) fibs
и tail fibs
, а второй оценивает попарное спаривание.
Prelude> [(x,y) | x <- [1,2,3], y <- [4,5,6]]
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]
Prelude> [(x,y) | (x,y) <- [1,2,3] `zip` [4,5,6]]
[(1,4),(2,5),(3,6)]
(Я новичок--!). Потому что я думаю, что первый делает то же самое, что и извлечение пары из последовательности вымыслов и хвоста. Не могли бы вы объяснить больше о первом?