nat2 :: [(整数,整数)]定义

时间:2011-05-16 17:08:54

标签: list haskell syntax

  

定义一个列表:

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 个答案:

答案 0 :(得分:4)

您有语法错误(您尝试运行它并检查输出吗?)

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

看起来很合理,但你最好判断。