Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell列表理解无限列表问题_Haskell_List Comprehension_Infinite_Hamming Numbers_Smooth Numbers - Fatal编程技术网

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和

我试图学习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
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..]]