【发布时间】:2023-04-10 08:15:01
【问题描述】:
我想从一个基对生成一个向量空间,它看起来像:
genFromPair (e1, e2) = [x*e1 + y*e2 | x <- [0..], y <- [0..]]
但是,当我检查输出时,似乎我得到了 [0, e2, 2*e2,...](即 x 永远不会超过 0)。当我考虑如何编写代码来执行此列表理解时,哪种是有意义的。
我编写了一些代码来从原点扩展“shell”(首先是范数为 0 的整数,然后是范数 1,然后是范数 2...),但这有点烦人,并且是 Z^2 特有的 - 我'd 必须为 Z^3 或 Z[i] 等重写它。有没有更清洁的方法?
【问题讨论】:
-
这就像证明有理数是可数的。而不是去 (1,1), (1,2), (1,3), ..., (2,1), ...,它永远不会让你进入第二行,而是按固定的总和递增:( 1,1); (1,2), (2,1); (1,3), (2,2), (3,1); ...
-
@Kerrek SB:谢谢,这就是我试图通过说我采取“扩展外壳”来表明的意思。我只是想知道是否有一种haskelly方式。
-
我不知道 Haskell,但在 C 中它会是一个双循环:
for (sum = 1; ; ++sum) for (i = 1; i < sum; ++i) print (i, sum - i); -
@Kerrek:在 Haskell 中:
[(x, s-x) | s <- [0..], x <- [0..s]] -
@hammar:谢谢 - 令人惊讶的自我描述 :-)
标签: haskell infinite cartesian-product