我目前正在处理函数,该函数将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
答案 0 :(得分:8)
您的实施问题是使用length
。使用带有无限列表的length
作为参数并不是一个好主意,因为列表无限长。
我建议改变实现以使用可以在无限列表上工作的其他函数,例如drop
和take
:
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..]