Unfoldの使いどころ
haskell
のコーディングでfoldr
は頻繁に使う印象がありますが。その双対(で、あってるのかな?)のunfold
は、あまり使わない印象があります。というか、使いどころのイメージがつかめませんでした。
この前、n進数間の変換に使えることに気づきました。
が、n進数間の変換にunfold
を使うのは、教科書の定番のようです。教科書をしっかり読むべきでした。
Programming in Haskellの7.9の練習問題6など。
実際にやりたかったことは、数値をバイナリにすることだったのですが、
generate :: (Num a, Integral b, B.Bits b) => b -> Maybe (a, b) generate val = if val == 0 then Nothing else Just (fromIntegral $ val B..&. 0xFF, val `B.shift` (-8))
を定義しておくと、
> :t Data.List.unfoldr generate 0x0efed Data.List.unfoldr generate 0x0efed :: Num a => [a] > Data.List.unfoldr generate 0x0efed [237,239] >
> :t Data.ByteString.unfoldr generate 0x0efed Data.ByteString.unfoldr generate 0x0efed :: B8.ByteString > Data.ByteString.unfoldr generate 0x0efed "\237\239"
ができます。
unfolrを使い分けることによって、結果を変えることができます。