Eff(atnos-eff)による実践的なコーディング集
by
Kushiro Taichi
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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