用途:在 F# 中实现依赖注入,让函数只声明自己用到的能力,由编译器推断依赖集合,避免显式传递大量参数。
主要能力:每个能力由两个接口组成——worker 接口(如 ILogger)持有操作,accessor 接口(如 IProvideLogger)暴露一个属性。env 只实现 accessor。函数以 (env: #IProvideX) 作为首参数并读取 env.X;组合函数不标注 env,由推断得出能力并集。accessor 只能暴露接口或普通值,不能暴露 Random、HttpClient 等具体类,测试需能控制 worker 返回值。每个能力一个模块。显式声明类型参数的函数必须把 'env 列入其中。保留 task 与 taskResult 块,Reader-monad 变体会丢失异步组合。
使用方式:先列出函数涉及的外部资源(日志、数据库、时钟、随机、配置、缓存),每个对应一个能力;声明 worker/accessor 对与模块;叶子函数写 (env: #IProvideX);组合函数不标注 env 并逐层传递;分别构建生产 env 与测试 env;添加缺少某能力的 breaks 脚本验证编译失败。
编译器信号:FS0193 表示 env 缺少调用树所需能力;warning FS0064 表示显式类型参数函数用了 #IProvideX 导致 env 未泛化,需显式命名 'env;签名打印具体接口而非 'a 时无需处理;FS0039 表示组合函数命名了 IWSAM 成员,应把检查移入叶子。
验证:运行 scripts/run.ps1,执行 Environment.fsx 与 FlatEnv.fsx,打印推断签名,并确认 scripts/breaks/ 下脚本按预期报错。
限制:资料未提供安装命令、收费、平台或性能数据;该模式依赖编译器推断,签名若出现具体 env 类型即失去泛型,需定位固定它的叶子函数。