下面的代碼保存爲一個給定的整數n的,從列表中的前n項,下降以下n項,保留接下來n等。它適用於任何有限列表。缺乏認識無限列表和seq運營商
爲了使其可用具有無窮列表,我使用的「序列」操作的遞歸步驟在與foldl」作爲例子之前,迫使蓄壓器的評價。
我測試通過跟蹤累加器的值,它似乎是,與有限列表期望它被有效地計算出來。
然而,當應用到無限的名單這是行不通的。主函數中的「take」只有在內部計算結束後纔會執行,當然,無限列表永遠不會發生。
請,有人可以告訴我在哪裏是我的錯?
main :: IO()
main = print (take 2 (foo 2 [1..100]))
foo :: Show a => Int -> [a] -> [a]
foo l lst = inFoo keepOrNot 1 l lst []
inFoo :: Show a => (Bool -> Int -> [a] -> [a] -> [a]) -> Int -> Int -> [a] -> [a] -> [a]
inFoo keepOrNot i l [] lstOut = lstOut
inFoo keepOrNot i l lstIn lstOut = let lstOut2 = (keepOrNot (odd i) l lstIn lstOut) in
stOut2 `seq` (inFoo keepOrNot (i+1) l (drop l lstIn) lstOut2)
keepOrNot :: Bool -> Int -> [a] -> [a] -> [a]
keepOrNot b n lst1 lst2 = case b of
True -> lst2 ++ (take n lst1)
False -> lst2
累加器圖案通常不能與無限列表 –
工作'inFoo'返回僅當輸入列表是'[]'的值。如果輸入列表是無限的,那麼沒有任何'drop'ping可以實現對'inFoo'的調用,其中輸入列表的其餘部分是[]'。 – pigworker