在 F# 中泛型采用一些不相关的类型的问题

Issue with generic taking some unrelated type, in F#

我有以下代码:

let exchangeInfo, marginBrackets, accountInfo =
    async {
            let failOrExtract = function
                | Ok    d -> d
                | Error (e: ExchangeError) -> e.Describe |> tee logger.Fatal |> failwith

        let pf = processResult >> failOrExtract

        let! e = rest.FuturesUsdt.System.GetExchangeInfoAsync() |> Async.AwaitTask
        let! b = rest.FuturesUsdt.GetBracketsAsync()            |> Async.AwaitTask
        let! i = rest.FuturesUsdt.Account.GetAccountInfoAsync() |> Async.AwaitTask

        return pf e, pf b, pf i
    } |> Async.RunSynchronously

简而言之,它调用了 3 个异步 rest 函数,然后通过由两部分组成的 failOrExtract 发送它们:returns Result<'a, ExchangeError> 类型的 processResult 部分,对于这些调用中的每一个都不同,然后 failOrExtract 要么失败要么returns 数据字段。

这不会编译,编译器说:

[FS0001] The type 'BinanceFuturesUsdtExchangeInfo' does not match the type 'System.Collections.Generic.IEnumerable<BinanceFuturesSymbolBracket>'```

看起来 failOrExtract 函数在第一次使用时是通用的,但自从 pf e 编译后就不是了,但是 pf b 和 pf i 有同样的错误。

为什么会出现此错误?

我认为您 运行 陷入了 F#“值限制”,尽管编译器对此并不清楚。这里的问题是 pf 被定义为一个值,而不是一个函数,所以编译器推断它有一个具体的非泛型类型。为了给 pf 一个通用签名,请尝试将其更改为:

let pf x = x |> processResult |> failOrExtract