Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 久代 太一 ( shiroichi315 ) アルプ株式会社 2021.06 ~ キーワード Scala, DDD, Agile, FP その他 Tortoiseshell, Tsukemen, Sauna, Bouldering 2

Slide 3

Slide 3 text

Eff ( Extensible Effects )とは 「Freer Monads, More Extensible Effects 」の論文で紹介 Efficient Freer, Open Union 「Extensible Effects in Scala 」- ねこはるさんの記事 3

Slide 4

Slide 4 text

Eff ( Extensible Effects )の実装 atnos-eff ライブラリを用いる 実装時の特徴 複数のエフェクトをフラットに扱う Interpreter による実行の分離 独自エフェクトの定義が可能 4

Slide 5

Slide 5 text

複数のエフェクトをフラットに扱う for 式に含まれるエフェクトを型パラメータで受け取る スマートコンストラクタによって Eff[R, A] 型に変換 5

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

独自エフェクトの定義が可能 エフェクト定義 スマートコンストラクタ Interpreter - 差し替え可能 7

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

実務のコードでは ... ? 例として Factory や Repository 内でエフェクトを用いることも Eff[R, A] 型を複数のメソッドで引き回すことが多い 9

Slide 10

Slide 10 text

map A 型の値に関数を適用 10

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

runPure Eff[R, A] から A を Option で囲んで取り出す エフェクトスタックが空であれば Some 、空でなければ None 空かどうかは式に依存しmock (pureEff )はエフェクトスタックに 含まれない 13

Slide 14

Slide 14 text

コーディングレベルでの悩みポイント 14

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

option, list エフェクトを用いるか アルプでは標準的には使っていない option 基本的には Either に変換 list 複雑な処理によりfor 式の中で他のエフェクト処理をフラットに挟 みたいケース等 17

Slide 18

Slide 18 text

実行の配線問題 一つのエフェクト実行で別のエフェクトが展開されることも 例: TransactionTask -> MyError ・ Task 展開される順序通りの実行が必要 18

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

アルプ独自の実装 23

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

To Be Continued... 26

Slide 27

Slide 27 text

参考リンク 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