在 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
我有以下代码:
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