Определить список:
nat2::[(Integer, Integer)]
, содержащий все пары неотрицательных целых чисел, упорядоченные по отношению, известному из доказательства теоремы Кантора:
(x1,y1) < (x2,y2) <=> x1+y1 < x2+y2 v (x1+y1=x2+y2 ^ x1 < x2)
[^ -означает альтернативный]
такой, что:
nat2 = [(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0),...]
Подсказка:
определение должно занимать одну строку и быть короче 45 символов.Обратите внимание, что сумма координат точек, лежащих на одной диагонали, постоянна.
Я дал какое-то определение, но не уверен, что оно правильное, вы можете проверить / починить / дать советы:
nat2::[(Integer,Integer)]
nat2=[(a,b-a)|b<-[0...],a<-[0...b]]
РЕДАКТИРОВАТЬ: ИЗМЕНЕНО:
nat2 :: [(Integer,Integer)]
nat2 = [(a,b-a) | b <- [0..], a <- [0..b]]
с результатом:
Prelude> :load "nat2.hs"
[1 of 1] Compiling Main ( nat2.hs, interpreted )
Ok, modules loaded: Main.
*Main> take 10 nat2
[(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0)]