我正在尝试理解阅读器(Reader)单子变换器。我正在使用 FSharpPlus,并尝试编译以下示例,其中首先从阅读器环境中读取一些内容,然后执行一些异步计算,最后将两个结果组合起来:
open FSharpPlus
open FSharpPlus.Data
let sampleReader = monad {
let! value = ask
return value * 2
}
let sampleWorkflow = monad {
do! Async.Sleep 5000
return 4
}
let doWork = monad {
let! envValue = sampleReader
let! workValue = liftAsync sampleWorkflow
return envValue + workValue
}
ReaderT.run doWork 3 |> Async.RunSynchronously |> printfn "Result: %d"
这样做会使我在代码行let! value = ask
处遇到编译错误,错误信息对我来说毫无用处,如下所示:
应用默认类型'obj'给类型推断变量时出现类型约束不匹配。没有与方法'op_GreaterGreaterEquals'匹配的重载。
已知返回类型:Async
已知类型参数:< obj,(int -> Async) >
感觉像是我漏掉了某个运算符,但我想不出来是哪个。
Async<_>
,sampleReader
只能与async
一起使用吗?我的意思是为什么它不能同时适用于Async<_>
和Option<_>
?这似乎是 FSharpPlus 的限制,对吧? - Johannes Egger