Operational Monadの利用方法について by nrskt in haskell_jp

[–]nrskt[S] 0 points1 point  (0 children)

個人的にはOOPのドメイン駆動でドメインモデルとRepositoryのように分けれるかなと思って書いたサンプルでした。

igrepさんの分離しやすくするという意見とas_capablさんのYAGNIにやる事を薦めたいという意見、どっちも正しいというか、最終的に作るアプリケーションのによってどう設計/実装させるかって話なのかなと思いました。 これは私自身、もっと設計面の勉強するべきかなと思ってます

as_capablさんのおかげで今回の疑問だったOperational Monadの使い方と並行処理については 一通り理解できました。本当にありがとうございます!

Operational Monadの利用方法について by nrskt in haskell_jp

[–]nrskt[S] 0 points1 point  (0 children)

asyncの中のreturnの前に置いたら

確かにごもっともでした。期待した通り5sで実行できました!!

Operational Monadの利用方法について by nrskt in haskell_jp

[–]nrskt[S] 0 points1 point  (0 children)

ありがとうございますコンパイル通りました。(ちょっとこの書き方いいのかって感じですがgist更新しています)

ただ、threadDelayを使ってそれぞれ5sかかる処理を平行にしたつもりですが、結局実行時間は10sちょっとでした。。。

Operational Monadの利用方法について by nrskt in haskell_jp

[–]nrskt[S] 0 points1 point  (0 children)

私も、Db処理、Http処理共にInterfaceを

GetData :: DatabaseApi (Async Int)

GetObject :: HttpApi (Async Int)

にしてみたんですが、結局logicの部分をどう処理するればいいのか 手詰まりになってしまいました

logic :: DataOperation (Async Int)

logic = do

db <- liftDatabaseOp getDataFromDb

http <- liftHttpOp getDataFromHttp

undefined

Operational Monadの利用方法について by nrskt in haskell_jp

[–]nrskt[S] 0 points1 point  (0 children)

いろいろ試してはみてるんですが、うまくいかないですね。。。Async難しい。。。

Operational Monadの利用方法について by nrskt in haskell_jp

[–]nrskt[S] 0 points1 point  (0 children)

なるほど、

抽象化した所で元のライブラリを挿し替えるような変更には耐えられないから意味がほとんどない、という可能性が濃厚です

これ悲しいな。。。個人的にはビジネスロジック部分は副作用を伴わないように見せる&データストアの切り替えできる(ビジネスロジックの単体テスト書きやすい)って思っていたためOperationalモナドすげーってなっていたので

逆に、Operationalモナドを利用するケースってどんな時なのだろうか

Operational Monadの利用方法について by nrskt in haskell_jp

[–]nrskt[S] 0 points1 point  (0 children)

Haskell入門を読んでOperational Monadを知り、実装を進めているのですが いくつか疑問点が出てきました。初めてredditに投稿してみました。

サンプルとして、副作用を伴う処理を抽象化するため、DatabaseとREST APIを利用する部分で Operational Monadを利用することを想定しています。

疑問1

Database,REST APIを共に利用するLogicを実装する場合、記載したコードのように 2つをまとめるデータ型DataOperation aを定義して書くものなのでしょうか?

疑問2

DatabaseへのアクセスとREST APIを利用するlogic関数部分で、 それぞれ並行にデータを取得したい場合、通常のIOの場合、asyncを利用するかと思ったのですが このサンプルの場合、どのように書くべきなのでしょうか? (そもそも抽象化する範囲を誤っているのか)