nat2 :: [(Integer, Integer)] определение - PullRequest
1 голос
/ 16 мая 2011

Определить список:

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)]

1 Ответ

4 голосов
/ 16 мая 2011

У вас есть синтаксическая ошибка (вы пробовали запустить ее и проверить вывод?)

Prelude> [(a,b-a)|b<-[0...],a<-[0...b]]

<interactive>:1:14:
    A section must be enclosed in parentheses thus: (0 ...)

Поскольку вам нужно только два .. в списке перечислений:

Prelude> take 10 [(a,b-a)|b<-[0..],a<-[0..b]]
[(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0)]    

Выглядит разумно, но ты лучший, чтобы судить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...