関数に対してDI
案
カリー化する
これはDIとは言わないと思うけど

引数として渡す
この辺はmonadが無いと無理
その他
定義の仕方が若干キモいけど、わからんではない
よく知らん
カリー化する
usecases.tsasync function usecase() {
const result = await repository();
return result
}
repositoeis.ts// test時はこれをexport
const getUsersRepository = (DB:DB) => async () => {
const result = await DB.get(`SELECT * FROM users WHERE id = ?`);
return result;
}
const db:DB = {}
// 通常はこれをexport
const repository = getUsersRepository(db)
Test Stubを使う
これで良くない?

引数として渡す
ReaderやFreeを使わない単純なアプローチ
依存を関数の頭から全部入れて、バケツリレーしていく感じ
fslet placeOrder
checkProductExists // dependency
checkAddressExists // dependency
getProductPrice // dependency
createOrderAcknowledgmentLetter // dependency
sendOrderAcknowledgment // dependency
: PlaceOrder = // definition of function
fun unvalidatedOrder -> ..
ちなみに、これらのdependencyは値ではなく関数
main関数で全部のdependencyをinjectionする
main関数が冗長になるが仕方がない
まあガチのdependencyならこれでもいいか。
問題はテストしたいだけなのに、ここまでしないといけないのか、という点

節の最後の方では、カリー化する例も書いてあった
>Haskell で Dependency Injection を実現する方法の一つとして Service パターンを紹介している記事👀
> DIの対象をレコード型で定義して関数の引数で渡すというシンプルなもの。RIO や Handle パターンなど他の手法との比較も書いてある