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

时间:2017-04-06 04:16:56

标签: haskell monads do-notation

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

gen :: Int -> Int -> [Int]
gen x y

每个元素都需要(x * y),x每次迭代都会增加y,原始x也必须在列表中。 所以

gen 2 4

会导致

[2,8,24,40,..]

我的所有尝试最终都会永远消失(我在ghci中使用“4(gen 2 4)”这样的调用)所以我不确定如何继续。无限列表只会给我带来很多麻烦。 我试图通过do-notation和list monad来做到这一点。我们非常感谢任何正确方向的帮助。

修改

这是我最后一次没有用的尝试。 我正在通过我的朋友学习Haskell,他给了我这个问题来学习列表monad的表示法。

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

2 个答案:

答案 0 :(得分:1)

我认为你可以创建一个List理解。

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

您可以在您的功能中使用它。您可以更改变量x而不是数字“2”和“y”而不是数字“4”。试试吧。

最后,我在List Comprehension和带有[2]的列表(变量x)之间建立了一个串联(++)。

答案 1 :(得分:0)

gen :: Int -> Int -> [Int]
gen x y = x : l
  where l = fmap (\m -> y * (2 + m * y)) [0..]

测试:

take 5 $ gen 2 4 [2,8,24,40,56]