IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

Unfoldの使いどころ

haskellのコーディングでfoldrは頻繁に使う印象がありますが。その双対(で、あってるのかな?)のunfoldは、あまり使わない印象があります。というか、使いどころのイメージがつかめませんでした。

この前、n進数間の変換に使えることに気づきました。 が、n進数間の変換にunfoldを使うのは、教科書の定番のようです。教科書をしっかり読むべきでした。

Programming in Haskellの7.9の練習問題6など。

[https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Haskell-Graham-Hutton/dp/4274067815:title]

実際にやりたかったことは、数値をバイナリにすることだったのですが、

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を使い分けることによって、結果を変えることができます。