gra*_*ray 3 haskell list-comprehension
如何在列表理解形式中表达{2n + 3m + 1 | n,m∈N}?N是自然数的集合,包括0.
以下Haskell函数将为您提供来自两个列表的所有对,即使其中一个或两个都是无限的.每对出现一次:
allPairs :: [a] -> [b] -> [(a, b)]
allPairs _ [] = []
allPairs [] _ = []
allPairs (a:as) (b:bs) =
(a, b) : ([(a, b) | b <- bs] `merge`
[(a, b) | a <- as] `merge`
allPairs as bs)
where merge (x:xs) l = x : merge l xs
merge [] l = l
Run Code Online (Sandbox Code Playgroud)
然后你可以把你的清单写成
[2 * n + 3 * m + 1 | (n,m) <- allPairs [0..] [0..] ]
Run Code Online (Sandbox Code Playgroud)
为了了解它是如何工作的,绘制一个无限的四分之一平面,并查看结果
take 100 $ allPairs [0..] [0..]
Run Code Online (Sandbox Code Playgroud)