如何在Haskell中基于两个输入生成无限列表?

如何在Haskell中基于两个输入生成无限列表?,haskell,monads,do-notation,Haskell,Monads,Do Notation,我需要根据两个输入生成一个无限列表 gen :: Int -> Int -> [Int] gen x y 每个元素都必须是(x*y),每次迭代x都要加y,并且原始x也必须在列表中。 所以 会导致 [2,8,24,40,..] 我所有的尝试都以永远失败告终(我在ghci中使用了“take 4(gen 2 4)”这个电话),所以我不知道如何继续。无限的列表给我带来了很多麻烦。 我试图通过do符号和单子列表来实现这一点。如果能在正确的方向上提供帮助,我们将不胜感激 编辑 这是我最后一次

我需要根据两个输入生成一个无限列表

gen :: Int -> Int -> [Int]
gen x y
每个元素都必须是(x*y),每次迭代x都要加y,并且原始x也必须在列表中。 所以

会导致

[2,8,24,40,..]
我所有的尝试都以永远失败告终(我在ghci中使用了“take 4(gen 2 4)”这个电话),所以我不知道如何继续。无限的列表给我带来了很多麻烦。 我试图通过do符号和单子列表来实现这一点。如果能在正确的方向上提供帮助,我们将不胜感激

编辑

这是我最后一次尝试,但没有成功。 我通过我的朋友学习Haskell,他给了我这个问题来学习列表单子的do符号

gen :: Int -> Int -> [Int]
gen x y = 
 do 
  a <- [x..]
  guard $ mod a (x*y) == 0
  let x = x+y
  return a
gen::Int->Int->[Int]
gen x y=
做

a我想你可以创建一个理解列表

ghci> [2]++[(4*i+2)*4|i<-[0..]]
ghci>[2]+[(4*i+2)*4*i
测试:

购买5美元gen 2 4

[2,8,24,40,56]

展示您的尝试!您使用do符号的原因是什么?是否需要?展开列表理解并将
([x]+)
替换为
(x:)
gen x y=x:fmap(\n->(x+n*y)*y)[0..
ghci> [2]++[(4*i+2)*4|i<-[0..]]
gen :: Int -> Int -> [Int]
gen x y = x : l
  where l = fmap (\m -> y * (2 + m * y)) [0..]