2015-04-07 22 views
0

我目前正在處理函數,它將2個整數和一個列表作爲參數,並返回一個列表,其中第一個列表中的元素位於這兩個整數之間的位置(function :: Int - >內部 - > [U] - > [U])。例如:代碼不適用於無限列表

>function 2 5 [1..10] 

回報

[2,3,4,5] 

上面的例子正在與我當前的代碼...但如果我喜歡插入一個無限列表[0..7]它返回一個「錯誤 - 垃圾收集不能收回足夠的空間「。有什麼建議麼? 下面是代碼

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

我們怎麼知道你的執行出了問題,當你不發佈它的源代碼? – leftaroundabout

+0

你是對的,發佈編輯。我沒有發佈代碼,因爲我沒有寫任何東西來處理無限列表... – DiVeRsi0n

+0

'function'有點奇怪;我們通常在Haskell中以'0'開始索引列表,而不是從'1'開始。也就是說,你可以很容易地根據前奏函數'drop'和'take'來定義它們,它們都可以在無限列表上正常運行。 'function start end = drop(start - 1)。結束'。 – Cirdec

回答

8

與實現的問題是使用length。使用帶有無限列表的length作爲參數並不是一個好主意,因爲,列表無限長。

我建議改變執行使用其他功能,這可以無限列表工作,如droptake

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

或者pointfree:

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

類型爲Int-> Int-> [u] - > [u]的函數不能在列表中搜索其參數,因爲沒有辦法將u與Int進行比較'。整數參數被描述爲「位置」或索引到列表中。 – Cirdec

+0

@Cirdec是的,我更新了我的答案。 – ThreeFx

+0

感謝您的回答,代碼有效,但它無法處理負面的輸入。我添加了這個和它的好現在: '| i <0 = function 0 j list | otherwise = take(j - i + 1)(drop(i - 1)list)' – DiVeRsi0n

1

如何:長度無限列表? 我認爲這是不可能的。

+0

當然,無限列表doesn'沒有長度。我已經知道我的代碼不適用於無限列表。我只是想知道一種方法來處理無限列表作爲輸入並返回正確的結果。 – DiVeRsi0n

0

的一種方法基於與指標壓縮和給定的範圍內,過濾掉那些不,

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