如何在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..]