LoginSignup
2
2

More than 1 year has passed since last update.

Cats Effect 3 の型クラスチートシート

Posted at

Cats の チートシートの Cats Effect 3 版を作った。

はじめに

Scala の 関数型プログラミングに慣れると、生のメソッドのシグネーチャより一段高い抽象度で型を考えたいことがある1。そのために Cats では Glossary(または Cheatsheet)が利用されてきた。

こんな感じ。
image.png

個人的にはすでに cats-free, cats-mtl, cats-effect 2.x, atnos-eff のチートシートを作って普段から使っていたが、ここでは新たに cats-effect 3 版を作る。

方針

  • 高い抽象度で一望・比較するためにあえて詳細を省いて、曖昧さもある程度許容している。
  • 基本的にオリジナルのスタイルを踏襲しつつ、さらに略記して見た目を簡潔にしている。
  • 概念の意味や各メソッドの用法の解説はしていない。
  • すべてのメソッドを載せるような網羅性にもこだわらない。

略記法

  • 1: Unit
  • 2: Boolean
  • n: Int
  • X?: Option[X]
  • X*: List[X]
  • F[X]: FX2
  • X×Y: (X, Y)
  • X+Y: Either[X, Y]
  • ⤳ : FunctionK
  • e: Throwable
  • fd: FiniteDuration
  • その他、必要に応じて各型クラスに個別に注釈した。

チートシート

※ syntax として提供されてる関数と型クラスインスタンス本体のメソッドで、シグネーチャが微妙に違うことがある3。その場合 syntax を優先した。

MonadCancel

安全なリソース管理4。2.x の Bracket に相当。MonadError5 から派生。

type method memo
FA → FB → FB forceR !> とも書ける
FA → FA uncancelable
FA → F1 → FA onCancel
FA → (A→FB) → (A→F1) → FB bracket
FA → (A→FB) → (A×ocB→F1) → FB bracketCase
FA → F1 → FA guarantee
FA → (ocA→F1) → FA guaranteeCase

ocX: Outcome[F,E,X] ... 2.x の ExitCase 相当。結果を表現。
DocumentationScaladoc

Unique

JVM 内ユニークなトークンを提供する型クラス。Spawn と Sync がこれを継承。

type method memo
F[Token] unique

DocumentationScaladoc

Spawn 6

Fiber7 生成の型クラス。MonadCancel と Unique を継承。2.x の Concurrent の一部を引き継いでいる。

type method memo
F1 cede 2.x の Async.shift
FA never
FA → F[fbA] start
FA → rs[ocA] background rs[X]: Resource[F,FX]
FA → FB → F[A+B] race
FA → FB → F[ocA + ocB] raceOutcome
FA → FB → F[ocA×fbB + fbA×ocB] racePair
FA → FB → F[A×B] both
FA → FB → F[ocA × ocB] bothOutcome

fbX: Fiber[F, E, X]
ocX: Outcome[F,E,X]

DocumentationScaladoc

Concurrent

Ref8 と Defered9 を扱う型クラス。Spawn を継承。2.x の Concurrent に相当するが、多くのメソッドが他の型クラスに移動してスリムになっている。

type method memo
A → F[rfA] ref rfX: Ref[F, X]
F[dfA] deferred dfX: Deferred[F, X]
FA → FFA memoize
n → m → FA → F[A*] parReplicateAN n はパラレル数, m は複製するAの数
n → TA → (A→FB) → FTB parTraverseN T は Traverse
n → TFA → FTA parSequenceN

DocumentationScaladoc

Clock

エフェクトフルな単調増加時間 / システム時間。2.x の Clock に相当。Sync と Temporal がこれを継承。

type method memo
F[fd] monotonic
F[fd] realTime
FA → F[fd × A] timed fd はかかった時間

DocumentationScaladoc

Temporal

Fiber のサスペンドとタイムアウトを扱う型クラス。Concurrent と Clock を継承。2.x の Concurrent、Timer あたり。

type method memo
fd → F1 sleep
FA → fd → FA delayBy
FA → fd → FA andWait
FA → fd → FA → FA timeoutTo フォールバック指定可能
FA → fd → FA timeout
FA → fd → FA timeoutAndForget

DocumentationScaladoc

Sync

同期FFI10 を扱う型クラス。Defer5, Clock, Unique, MonadCancel を継承。2.x の SyncBlocker あたり。

type method memo
A → FA delay
A → FA blocking
A → FA interruptible
A → FA interruptibleMany
Sync.Type → A → FA suspend Type が delay 以下 4タイプに対応
FA → FA defer

DocumentationScaladoc

Async

非同期FFI を扱う型クラス。Temporal, Sync を継承。

type method memo
(e+A → 1) → F[F1?] → FA async
(e+A → 1) → 1 → FA async_
FA → ec → FA evalOn ec: ExecusionContext
ec → FA → (F⤳F) evalOnK
FA → ec → F[fbA] startOn fbX: Fiber[F, Throwable, X]
FA → ec → rs[ocA] backgroundOn
F[ec] executionContext
F[ftA] → FA fromFuture ftA: Future[A]

rs[X]: Resource[F,FX]
ocX: Outcome[F, Throwable, X]

DocumentationScaladoc

参考

  1. この逆も言えると思う。

  2. []を省略するとわかりにくい場合は残した

  3. たとえば MonadCancel#uncancelable で Poll を渡すかどうかの違いなど。

  4. 昔ながらのローンパターンのような感じ

  5. MonadError と Defer は Cats 本体の型クラス。 2

  6. 伝統的にプロセスを生成する関数が spawn と呼ばれてきたが、この spawn は Fiber を産み出す。

  7. Fiber: 概念API doc,

  8. Ref: 概念API doc

  9. Defered: 概念API doc

  10. ここで言う FFI は、文字通りの外部言語とのI/Fというより、副作用のある inpure 界と参照透過な pure 界のI/Fといった意味(参照

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2