Replying to Avatar YoshikuniJujo

「メタデータ - 複数のデータ」みたいなのが複数ある構造で、ひとつずつ読んでいきたいとき、前のひとまとまりの終わりは「メタデータ」を読むまで最後かどうかわからないわけで、でも前の「ひとまとまり」のところでメタデータを読み込んじゃうと、次の「ひとまとまり」のときにメタデータを再読み込みすることになる。

状態の保存とかを使わずにきれいに書くにはどうしたらいいかな。

メタデータの内容を引数としてとり、次の「ひとまとまり」用のメタデータの内容を返り値として返すような関数またはモナドを使えば良さそうだ。

で次の「ひとまとまり」用のメタデータが存在しないときはNothingを返し、これを終了の合図にすればいい。

foo :: Meta -> m (Maybe Meta)

foos :: Meta -> m ()

foos m = foo m >>= \case

Nothing -> pure ()

Just m' -> foos m'

Avatar
YoshikuniJujo 3mo ago

一般化すると

whileWithMeta :: (meta -> m (Maybe meta)) -> meta -> m ()

whileWithMeta act meta = act meta >>= \case

Nothing -> pure ()

Just meta' -> whileWithMeta act meta'

かな。

Reply to this note

Please Login to reply.

Discussion

No replies yet.