Haskell列表理解无限列表问题
我试图学习Haskell和理解列表,但无法找到解决方案:Haskell列表理解无限列表问题,haskell,list-comprehension,infinite,hamming-numbers,smooth-numbers,Haskell,List Comprehension,Infinite,Hamming Numbers,Smooth Numbers,我试图学习Haskell和理解列表,但无法找到解决方案: mylist = [x*y | x <- [1..], y <- [1..]] 因为在列表理解中,x取值1,然后y反复更改值 但我的目标是完成一项不同的任务,以获得以下结果: mylist = [1,2,2,4,3,3,6.....] 我的意思是,我希望组合是混合的,而不是分开的,因为我有一个严重的问题,要得到合适的结果 我将举一个更具体的例子 我想要一份包含此表格所有编号的列表: num = 2^x * 3^y x和
mylist = [x*y | x <- [1..], y <- [1..]]
因为在列表理解中,x
取值1
,然后y
反复更改值
但我的目标是完成一项不同的任务,以获得以下结果:
mylist = [1,2,2,4,3,3,6.....]
我的意思是,我希望组合是混合的,而不是分开的,因为我有一个严重的问题,要得到合适的结果
我将举一个更具体的例子
我想要一份包含此表格所有编号的列表:
num = 2^x * 3^y
x
和y
必须取所有值>=0
我的做法如下:
powers = [2^x * 3^y | x <- [0..], y <- [0..]]
为了合并不同的值,但同样,缺少值6、12等-结果如下:
mylist = [1,2,3,4,8,9,16,27,32,64,81...]
你展示的代码
multiples = nub (merge (<=) powers2 powers3)
powers3 = [2^x * 3^y | x <- [0..], y <- [0..]]
powers2 = [2^x * 3^y | y <- [0..], x <- [0..]]
现在我们有进展了。至少现在没有跳过。我们只需要了解如何将它们合并成一个排序的、不断增加的数字流。简单的concat
当然不行。我们需要按顺序合并它们。一个著名的函数merge
就是这样做的,只要参数已经排序,就会增加列表
生产的每一行已经按递增顺序排列,但它们的数量是无限的。不要害怕,foldr
可以做到。我们定义
mults23 = foldr g [] [[2^x * 3^y | y <- [0..]] | x <- [0..]]
-- foldr g [] [a,b,c,...] == a `g` (b `g` (c `g` (....)))
where
g (x:xs) ys =
就是这样。您显示的代码
multiples = nub (merge (<=) powers2 powers3)
powers3 = [2^x * 3^y | x <- [0..], y <- [0..]]
powers2 = [2^x * 3^y | y <- [0..], x <- [0..]]
现在我们有进展了。至少现在没有跳过。我们只需要了解如何将它们合并成一个排序的、不断增加的数字流。简单的concat
当然不行。我们需要按顺序合并它们。一个著名的函数merge
就是这样做的,只要参数已经排序,就会增加列表
生产的每一行已经按递增顺序排列,但它们的数量是无限的。不要害怕,foldr
可以做到。我们定义
mults23 = foldr g [] [[2^x * 3^y | y <- [0..]] | x <- [0..]]
-- foldr g [] [a,b,c,...] == a `g` (b `g` (c `g` (....)))
where
g (x:xs) ys =
就是这样。工具使用 我需要一个无限笛卡尔积函数。无限函数必须取表的对角线。 对角线遍历的成对模式为 0-01,10-02,11,20-03,12,21,30 我喜欢对称性,但是模式是用第一个数字向前计数,用第二个数字向后计数,当用无限函数表示时,它是
diag2 xs ys = [ (m,n) | i<- [1..], (m,n) <- zip (take i xs) (reverse.take i $ ys) ]
制作和使用taket
是一件好事,直到你学会了前10个左右的三角形数字
taket n xs = take (tri $ revt n) xs
现在,有了一些工具,我们将它们(主要是1)应用于一个问题
[ 2^a * 3^b | (a,b) <- sort.taket 25 $ diag2 [0..] [0..]]
[2^a*3^b|(a,b)工具使用
我需要一个无限笛卡尔积函数。一个无限函数必须取一张表的对角线。
对角线遍历的成对模式为
0-01,10-02,11,20-03,12,21,30
我喜欢对称性,但是模式是用第一个数字向前计数,用第二个数字向后计数,当用无限函数表示时,它是
diag2 xs ys = [ (m,n) | i<- [1..], (m,n) <- zip (take i xs) (reverse.take i $ ys) ]
制作和使用taket
是一件好事,直到你学会了前10个左右的三角形数字
taket n xs = take (tri $ revt n) xs
现在,有了一些工具,我们将它们(主要是1)应用于一个问题
[ 2^a * 3^b | (a,b) <- sort.taket 25 $ diag2 [0..] [0..]]
[2^a*3^b|(a,b)那么这只是一个排序的问题吗?我想知道[x*y|(x,y)@BartekBanachewicz是否只是在sort
前加了对有限列表进行排序。如果在二维网格上排列所有值x,y
,你能显示你打算迭代它们的路径吗?powers3呢=[2^x*3^y | x@mkrieger1简单递增顺序。你可能指的是合并,而不是合并排序。@Jam aica是的,可以这样做。有一个包数据顺序列表;我添加的两个标记有许多高度相关的条目。:)所以这只是顺序问题吗?我想知道[x*y |(x,y)@BartekBanachewicz只需预先编写sort
就可以处理有限列表。如果您将所有值x,y
排列在二维网格上,您能否显示您打算迭代它们的路径?powers3如何=[2^x*3^y | x@mkrieger1简单递增顺序。你可能指的是合并,而不是合并排序。@Jam aica是的,可以做到。有一个包数据顺序列表;我添加的两个标记有许多高度相关的条目。:)宾果!成功了。请不要搞错,我写的列表不是你在开始时指出的列表,与mults23|2D相同但是我还没有做到这样的排序!如果我想加上方程式5^z?(2^x*3^y*5^z),我该怎么处理呢要像上面的注释一样添加5^z,我们只需要一个双嵌套的foldr…result=foldr g[]foldr g…]答对了!成功了。毫无疑问,我写的列表不是你开始时指出的列表,与mults23_2D的列表相同,但我没有成功地进行这种排序!如果我想将它添加到等式5^z?(2^x*3^y*5^z)中,我该如何处理它要像上面的注释一样添加5^z,我们只需要一个双嵌套的foldr…result=foldr g[]foldr g…]
[ 2^a * 3^b | (a,b) <- sort.taket 25 $ diag2 [0..] [0..]]