我需要根据两个输入生成一个无限列表。
gen :: Int -> Int -> [Int]
gen x y
每个元素都需要是 (x*y),并且每次迭代 x 都会增加 y,并且原始 x 也必须在列表中。 所以
gen 2 4
会导致
[2,8,24,40,..]
我的所有尝试最终都将永远进行下去(我在 ghci 中使用“take 4 (gen 2 4)”调用),所以我不知道如何继续。无限的列表只会给我带来很多麻烦。 我试图通过 do 表示法和列表 monad 来做到这一点。任何正确方向的帮助将不胜感激。
编辑
这是我最后一次尝试,但没有成功。 我正在通过我的 friend 学习 Haskell,他给了我这个问题来学习列表 monad 的 do 表示法。
gen :: Int -> Int -> [Int]
gen x y =
do
a <- [x..]
guard $ mod a (x*y) == 0
let x = x+y
return a
最佳答案
我认为你可以创建一个列表理解。
ghci> [2]++[(4*i+2)*4|i<-[0..]]
您可以在您的函数中使用它。您可以更改变量 x 而不是数字“2”,也可以更改变量“y”而不是数字“4”。尝试一下。
最后,我在列表推导式和带有 [2](变量 x)的列表之间进行了串联 (++)。
关于haskell - 如何根据两个输入在 Haskell 中生成无限列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43245611/