F# 在 func `lambda` 和 `lambda` 之间存在差异 |> func

F# has a discrepancy between func `lambda` and `lambda` |> func

我正在使用 FSharpPlus 库,但两者之间存在差异

#r "nuget: FSharpPlus"
open FSharpPlus

memoizeN (fun x y -> x,y)       // error FS0073: internal error: recursive class hierarchy (detected in TypeFeasiblySubsumesType), ty1 = MemoizeN

(fun x y -> x,y) |> memoizeN    // OK

为什么会出现这种情况,有没有办法使用前者?

这不是因为 lambda,这是一种角落类型推理案例。

F# 类型推断是从左到右进行的,因此在某些情况下,它无法推断出泛型函数的正确类型,除非其参数的类型信息已经被推断出来。

一个更简单的案例可能是这样的:

let x = (fun lst -> lst.Length) [0]