3

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

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-notation 和 list monad 来做到这一点。任何在正确方向上的帮助将不胜感激。

编辑

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

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

2 回答 2

1

我认为您可以创建一个列表理解。

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

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

最后,我在 List Comprehension 和带有 [2] 的列表(变量 x)之间进行了连接 (++)。

于 2017-04-06T08:49:28.937 回答
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]

于 2017-04-06T18:37:58.577 回答