Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Cats EffectのforeverMのMはモナドのM

Cats Effectには、foreverMという >> を無限に繰り返すことと等価なメソッドがある:

import scala.concurrent.duration._
import scala.language.postfixOps
val wait = 100 milliseconds
def indicator: IO[Unit] =
    IO.sleep(wait) >> (IO.print("\r|") >> IO.sleep(wait) >> IO.print("\r/") >> IO.sleep(wait) >> IO.print("\r-") >> IO.sleep(wait) >> IO.print("\r\\") >> IO.sleep(wait)).foreverM

これを実行すると、棒がずっとクルクルし続ける。

ところで、foreverMのMってなんだろう。ドキュメントを探してみたけれど、いまいち有効な答えを見付けられなかったので、Discordに質問に行った。

discordapp.com

結果、MonadのMで合っていた。曰く、

  • モナドのMだよ
  • foreverMはApplicativeのみでは実装できなくて、flatMapが必要になる
  • なぜかというと、順番通りにぐるぐる繰り返す必要があるわけだから、逐次構造を扱うための表現力が必要になるから
    • Applicativeにはそれができず
    • Monadには(flatMapがあるから)それができる

実装ではtailRecMを使って実装されている。

github.com

とのことだった。

ところで、Haskellではそうでもないとのこと。

https://hackage.haskell.org/package/base-4.17.0.0/docs/src/Control.Monad.html#forever

こっちは *> で実装されていて、Applicativeで十分ということになっている。

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?