foldlで書くときに、出力側のリストに出力する値と、入力側のリストの次の値の処理をするための値を別にできると良いなと思っていたのですが、mapAccumLを使うとできるようです。
というわけで、昨日のconvを変形。
conv :: String -> [(Int, Int)] conv = snd . mapAccumL f 0 where f :: Int -> Char -> (Int, (Int, Int)) f n 'R' = (n + 1, (n, 1)) f n 'F' = (n - 1, (n - 1, -1)) f n 'C' = (n, (n, 0))
あまり変わっていないような気がしますが、気分的にはかなりすっきりしました。
いいですね。 <br>mapAccumLの使用例がなかなかないなかで、これは非常に良い例ですね。 <br>参考になりました。