代码不适用于无限列表

时间:2015-04-07 11:44:54

标签: haskell

我目前正在处理函数,该函数将2个整数和一个列表作为参数,并返回一个列表,其中包含第一个列表的元素,这些元素位于这两个整数之间的位置(函数:: Int-> Int - > [U] - > [U])。例如:

>function 2 5 [1..10]

返回

[2,3,4,5]

上面的示例正在使用我当前的代码...但是如果我插入一个像[0 ..]这样的无限列表,它会返回一个"错误 - 垃圾收集无法回收足够的空间"。有什么建议? 这是代码

function :: Int->Int->[u]->[u]                                                       
function i j s
    |i<0 = function 0 j s
    |j< length s = function i j (init s) 
    |j-i< (length s)-1 = function i j (tail s)
    |otherwise = s

3 个答案:

答案 0 :(得分:8)

您的实施问题是使用length。使用带有无限列表的length作为参数并不是一个好主意,因为列表无限长。

我建议改变实现以使用可以在无限列表上工作的其他函数,例如droptake

function :: Int -> Int -> [a] -> [a]
function i j list = take (i - j + 1) (drop (i - 1) list)

或者,无点:

function i j = take (j - i + 1) . drop (i - 1)

答案 1 :(得分:1)

如何:无限列表的长度? 我认为这是不可能的。

答案 2 :(得分:0)

一种基于索引压缩并过滤掉不在给定范围内的方法的方法,

f :: Int -> Int -> [a] -> [a]
f i j = map (snd) . filter (\v -> fst v `elem` [i..j]) . zip [1..]