Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Eff(atnos-eff)による実践的なコーディング集

 Eff(atnos-eff)による実践的なコーディング集

関連リンク:
- 「アルプのEff独自エフェクト集 」
- スライド最後に紹介している発表になります
- https://speakerdeck.com/ma2k8/alp-original-eff-pearls

2e0cd730106894978bab84142f69b6c3?s=128

Kushiro Taichi

March 04, 2022
Tweet

More Decks by Kushiro Taichi

Other Decks in Programming

Transcript

  1. Eff ( atnos-eff )による実践的なコーデ ィング集 Kushiro Taichi at Alp,Inc. 1

  2. 自己紹介 久代 太一 ( shiroichi315 ) アルプ株式会社 2021.06 ~ キーワード

    Scala, DDD, Agile, FP その他 Tortoiseshell, Tsukemen, Sauna, Bouldering 2
  3. Eff ( Extensible Effects )とは 「Freer Monads, More Extensible Effects

    」の論文で紹介 Efficient Freer, Open Union 「Extensible Effects in Scala 」- ねこはるさんの記事 3
  4. Eff ( Extensible Effects )の実装 atnos-eff ライブラリを用いる 実装時の特徴 複数のエフェクトをフラットに扱う Interpreter

    による実行の分離 独自エフェクトの定義が可能 4
  5. 複数のエフェクトをフラットに扱う for 式に含まれるエフェクトを型パラメータで受け取る スマートコンストラクタによって Eff[R, A] 型に変換 5

  6. Interpreter による実行の分離 Open Union によりエフェクトのスタックを定義 Interpreter による実行 - Controller 実行順により型の結果が変わる

    - 値の結果は変わらない 6
  7. 独自エフェクトの定義が可能 エフェクト定義 スマートコンストラクタ Interpreter - 差し替え可能 7

  8. コーディング集 実務に近いコードを紹介していきます 8

  9. 実務のコードでは ... ? 例として Factory や Repository 内でエフェクトを用いることも Eff[R, A]

    型を複数のメソッドで引き回すことが多い 9
  10. map A 型の値に関数を適用 10

  11. pureEff pure な A 型の値を Eff[R, A] 型に変換 11

  12. traverseA Eff[R, A] 型を返す処理を走査する sequenceA も存在 12

  13. runPure Eff[R, A] から A を Option で囲んで取り出す エフェクトスタックが空であれば Some

    、空でなければ None 空かどうかは式に依存しmock (pureEff )はエフェクトスタックに 含まれない 13
  14. コーディングレベルでの悩みポイント 14

  15. flatMap のコンテキスト指定 for 式の最初の処理の型にコンテキストが束縛される 15

  16. どのタイミングで Eff[R, A] に変換するか テストが煩雑になることも ドメインロジックはピュアに書く? 16

  17. option, list エフェクトを用いるか アルプでは標準的には使っていない option 基本的には Either に変換 list 複雑な処理によりfor

    式の中で他のエフェクト処理をフラットに挟 みたいケース等 17
  18. 実行の配線問題 一つのエフェクト実行で別のエフェクトが展開されることも 例: TransactionTask -> MyError ・ Task 展開される順序通りの実行が必要 18

  19. 実装をカプセル化はするが実装知識も大事 DB のコネクション、セッションどうなってる? 抽象化されていても意識は忘れない 19

  20. とはいえ個人・会社的にも Eff はポジテ ィブ 20

  21. ドメインに集中できる 実装がカプセル化されユースケースの見通しが良くなる シグネチャに現れるエフェクトによって可読性が増す ユースケースに対して発生するエフェクトが把握できる 21

  22. 学習コストが低い(という見方もできる) モナトラの型合わせの方が脳のメモリを使う印象 覚えるAPI インターフェースの数は少ない チーム内に理論含め詳しい人は必要 22

  23. アルプ独自の実装 23

  24. 独自エフェクトが多数用いられている 独自エラー ID 生成 DB トランザクション(doobie 公式) etc. 24

  25. 独自エラーエフェクトに対するスマートコンス トラクタを多数定義 25

  26. To Be Continued... 26

  27. 参考リンク atnos-eff 公式チュートリアル https://atnos-org.github.io/eff/ Freer Monads, More Extensible Effects https://okmij.org/ftp/Haskell/extensible/more.pdf

    Extensible Effects in Scala https://halcat.org/scala/extensible/index.html Scala + CleanArchitecture に Eff を組み込んでみた https://tech.recruit-mp.co.jp/server-side/post-18728/ 27