Haskell:无限期地重复给定的有限列表

时间:2018-01-24 21:45:04

标签: list haskell

我在Haskell中是一个新的,我正在尝试定义一个函数,它需要一个有限列表并创建一个无限列表,在每个重复1中添加到列表的每个元素。例如,如果我有列表[3,4,5],该函数将生成列表[3,4,5,4,5,6,5,6,7 ....]

我正在考虑类似循环的东西,它将是无限的,它会将每个循环添加到每个元素,然后将其添加到列表中。但问题是我不确切知道如何在Haskell中编写它!

2 个答案:

答案 0 :(得分:2)

GHCi中的快速示例:

> let f x = x ++ (f $ map (+1) x)
> take 10 $ f [3,4,5]
[3,4,5,4,5,6,5,6,7,6]

这里,我们定义一个递归函数f,它只是将递归调用的输出附加到初始列表中,每个数字加1。我们可以分解它来更仔细地检查功能。

GHCi将为您提供有关f正在使用的类型

的信息
> :t f
f :: Num b => [b] -> [b]

这意味着它可以使用Num实例(如Int)处理任何事物列表。

那么f做了什么?

> let f x = x ++ (f $ map (+1) x)
            ^ -- Start with the initial list we pass in 
                      ^ -- Modify each element of that list and increment their values by 1. 
                      ^ -- This is where the `Num` constraint comes in
                  ^ -- Recursively call f with the new "initial list"
               ^ -- Append the result of calling f recursively to the initial list

答案 1 :(得分:2)

您需要的组件是:

  • $("#printall").on("click",function(){ var iframes = document.getElementsByTagName("iframe"); var i = 0; window.setInterval(function(){ if(i < iframes.length){ i++; } }, 3000); }); 为列表中的每个元素添加1
  • map (+ 1) :: Num n => [n] -> [n]创建一个无限列表,其中每个元素都是前一个元素的函数
  • iterate :: (a -> a) -> a -> [a]以展平列表列表
  • concat :: [[a]] -> [a]我们将使用它来获取前9个元素,以便进行测试,以避免尝试打印无限列表
take 9 :: [a] -> [a]