我需要根据两个输入生成无限列表。
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
答案 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]