我在Haskell中是一个新的,我正在尝试定义一个函数,它需要一个有限列表并创建一个无限列表,在每个重复1中添加到列表的每个元素。例如,如果我有列表[3,4,5],该函数将生成列表[3,4,5,4,5,6,5,6,7 ....]
我正在考虑类似循环的东西,它将是无限的,它会将每个循环添加到每个元素,然后将其添加到列表中。但问题是我不确切知道如何在Haskell中编写它!
答案 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]