Arrow 库的 Kleisli 组合子:纯函数式依赖注入
利用 Arrow 的 Kleisli (ReaderT) 构建类型安全的依赖注入系统,替代手动传参或框架。 · 难度:入门 · +10XP
Arrow 库的 Kleisli 组合子:纯函数式依赖注入
Kleisli 是函数式编程中用于组合带有上下文 (如 Reader) 的函数的抽象。本教程使用 Kotlin Arrow 库的 Kleisli 类型,将依赖 (如数据库连接、配置) 编码为 Reader 并组合成整个应用逻辑链。这种方式不需要任何运行时框架、反射或注入容器。你将看到如何通过 map/flatMap 组合多个需要相同依赖的函数,并保持纯引用透明性。
import arrow.core.*
import arrow.core.extensions.fx
typealias DbConfig = Map
typealias DbReader = Kleisli
fun loadUser(id: Int): DbReader = Kleisli { config ->
Id("User from ${config["db.url"]} with id $id")
}
fun greet(user: String): DbReader = Kleisli { _ ->
Id("Hello $user")
}
fun main() {
val program = DbReader.fx {
val user = !loadUser(42)
val greeting = !greet(user)
greeting
}
println(program.run(Id(mapOf("db.url" to "localhost"))))
}