haskell - 如何根据两个输入在 Haskell 中生成无限列表?

标签 haskell monads do-notation

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

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/

相关文章:

arrays - Haskell 可变结构与不可变 Shell

Haskell 从 IO 域获取值

haskell - 仅使用一元绑定(bind)语法表达 do block

haskell - 在 Haskell 中创建哈希表

haskell - 单子(monad)定律的解释

haskell - 成对的 Monad 实例

haskell - 返回从 monad 中提取的元素;多余的?

haskell - 如果我知道它在运行时是真的,我如何告诉 GHC 满足类型级别 <= 约束?

multithreading - 为什么 putStrLn 行尾没有线程锁?

haskell - 简化 Haskell 中的 Monadic 类型签名