と に似た 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
どちらも述語とリストを取り、述語が累積された結果を入力として受け取るという点で通常のfilter
and とは異なります。takeWhile
私の問題は、filter even [1..]
すぐに(遅延して)出力の生成を開始しながら、filterAcc (any even) [1..]
ハングすることです。私の疑いは、ヘルパー関数go
がこれらの関数の遅延動作を妨げているということです。
これらの関数を遅延して動作させるにはどうすればよいですか?