在 F# 中,集合函数可以直接用作它们支持的类型的方法吗?

Tho*_*mas 1 f#

这是一个纯粹出于好奇的问题:

假设我有这个对象:

let a = [1; 2; 3; 4]
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式获得最大值:

a |> List.max
List.max a
Run Code Online (Sandbox Code Playgroud)

但是有什么可以阻止将其设置为:

a.max
Run Code Online (Sandbox Code Playgroud)

同样,如果我想要一个排序列表,然后取前 2 个结果:

a |> List.sort |> List.truncate 2
Run Code Online (Sandbox Code Playgroud)

但是关于:

a.sort.truncate(2)
Run Code Online (Sandbox Code Playgroud)

我知道这不是 F# 的惯用语,但是既然库在那里,为什么也不允许这样做呢?我很好奇是否有明确的原因不启用此选项。

Phi*_*ter 5

通过FSharp.Core.Fluent-4.0包,您可以做到这一点。

F# 5 脚本:

#r "nuget:FSharp.Core.Fluent-4.0"
open FSharp.Core.Fluent

let a = [1..10]

printfn $"{a.max()}"
printfn $"{a.map(fun x -> x + 1)}"
printfn $"{a.filter(fun x -> x % 2 <> 0)}"
Run Code Online (Sandbox Code Playgroud)

它不是 F# 的默认选项,因为在相同的集合函数上提供替代“视图”从来都不是设计目标。如果您对此感兴趣,可以在语言和核心库建议存储库中提出建议并与社区贡献者讨论。