と に似た 2 つの機能がfilterありtakeWhileます。
filterAcc, takeWhileAcc :: ([a] -> Bool) -> [a] -> [a]
filterAcc p xs = go xs []
where go [] acc = acc
go (x:xs) acc
| p (x:acc) = go xs (x:acc)
| otherwise = go xs acc
takeWhileAcc p xs = go xs []
where go [] acc = acc
go (x:xs) acc
| p (x:acc) = go xs (x:acc)
| otherwise = acc
どちらも述語とリストを取り、述語が累積された結果を入力として受け取るという点で通常のfilterand とは異なります。takeWhile
私の問題は、filter even [1..]すぐに(遅延して)出力の生成を開始しながら、filterAcc (any even) [1..]ハングすることです。私の疑いは、ヘルパー関数goがこれらの関数の遅延動作を妨げているということです。
これらの関数を遅延して動作させるにはどうすればよいですか?