【问题标题】:Implementing infinite lists in haskell在haskell中实现无限列表
【发布时间】:2014-03-15 03:59:44
【问题描述】:

一直在努力。不知道从这里去哪里..

我需要定义一个函数,它接受一个整数并返回一个从 0 到 n-1 的无限重复数字列表。

    cycle n =
        let aux1 v1 n 
            |(v1 == n) = v1 : (aux1 0 n)
            | (v1<n) = v1 : (aux1 (v1 + 1) n)
        in aux1 0 n

【问题讨论】:

  • 您的解决方案不是最短的解决方案,也不是最“实用”的解决方案,但它很接近:我可以通过删除三个字符来修复您的代码。你为什么不向我们展示你得到了什么,并解释你为什么会被卡住?
  • 对于更清洁的解决方案,您可以查看Enum here 和几个精心挑选的列表函数here
  • 我得到了模棱两可的出现“循环”。我昨天刚开始使用 Haskell,我什至不知道那是什么意思。
  • 您可以使用Main.cycle(在GHCi 中)或MyModule.cycle(如果您在模块中)或通过重命名函数来限定函数调用。问题是你调用了你的函数cycle,而already exists in the Prelude

标签: list haskell recursion infinite


【解决方案1】:

@piotrek

还有一个更短的解决方案:

cycle' n = [0..]>>[0..n-1]

【讨论】:

  • 这是一种非常简洁的方式来解释列表单子。我从来没想过。
【解决方案2】:

cycle' n = [0..n-1] ++ cycle' n

但我必须添加一些字符,以便堆栈溢出可以接受这样一个简短的答案:)

【讨论】:

    【解决方案3】:
    cycle' n = xs
        where xs = take n [0 ..] ++ xs
    

    【讨论】:

    • cycle' n = cycle [0 .. n-1]
    【解决方案4】:

    生成大量无限序列的一种简单而简单的方法是在简单流上使用高阶函数(mapfilterfold)。

    例如,这里有两种生成无限自然偶数序列的方法:

    evens = filter even [1..]
    evens = map (*2) [1..]
    

    使用此方法可以轻松解决您的问题。你可能想看看mod 做了什么。祝你好运!

    【讨论】:

      【解决方案5】:

      我会这样做:

      cycle' n = concat $ repeat [0..n-1]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-16
        • 2023-03-10
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多