F# 常见类上fsharp中的静态函数

F# 常见类上fsharp中的静态函数,f#,extension-methods,static-methods,F#,Extension Methods,Static Methods,我经常调用调用静态类的静态方法,这对我来说似乎很不自然: let l = Seq.length myseq 对我来说,使用它会更自然 let l = myseq.length 您可以想象,对于许多基类来说都是一样的 有没有一种方法可以让所有这些方法都作为实例方法自动可用,而不必为每个方法编写扩展方法?使用管道操作符如何 let l = myseq |> Seq.length 编辑: 或 编辑2: 正如kvb指出的,Count()需要System.Linq,是因为您没有Intelli

我经常调用调用静态类的静态方法,这对我来说似乎很不自然:

let l = Seq.length myseq
对我来说,使用它会更自然

let l =  myseq.length
您可以想象,对于许多基类来说都是一样的


有没有一种方法可以让所有这些方法都作为实例方法自动可用,而不必为每个方法编写扩展方法?

使用管道操作符如何

let l = myseq |> Seq.length
编辑: 或

编辑2:


正如kvb指出的,Count()需要System.Linq,是因为您没有Intellisense帮助您查看哪些操作可用,这让您感到困扰吗

正如Umair在上面所写的,流水线风格在某种程度上是您所寻找的最接近的方式。但实际上,您必须知道定义函数的正确模块

有没有一种方法可以让所有这些方法都作为实例方法自动可用,而不必为每个方法编写扩展方法


不。即使这样做了,也会失去F#中类型推断的好处。

一般来说,没有办法将模块中的值视为实例成员。但是,对于
Seq
模块,您可以在
System.Linq
命名空间中找到许多
Seq
函数的扩展成员类似物,因此您可以执行以下操作:

open System.Linq

let arr = [| 1 .. 10 |]
let ct = arr.Count()
let arr2 = arr.Select(fun i -> i + 1)
// etc.

它甚至更加冗长。。。虽然我同意它更适合于“函数”范式,因为它的组成我是F#的新手,但在Linqpad中玩的时候,我注意到序列(在F#中)实现了一个枚举器。所以我尝试了myseq.Count(),它似乎奏效了!我明白你的意思,但我认为其中一些是我们很多人所处的OO思维模式的制约。我们习惯于考虑对象上的方法,而不是考虑函数带参数。你可能会发现这很有帮助。@OnorioCatenacci我完全同意,这是一种简单的哑OO风格,可能会损害函数的改进。但是对于像这样的简单属性,我觉得它更好。更不用说智能感知了,我认为它是一个强大的功能。由于存在一对一的关系,因此使用产生最低程度冗长的形式并非毫无意义。但我完全同意你的说法。@nicolas如果你在代码冗长方面是塔利班分子,欢迎来到函数式编程——你就在这里。:-)说真的,我明白你的意思,但正如我所说的,这更多的是一个思考函数的问题,考虑的是参数而不是类的成员。呵呵,我一直在思考相反的方向:从实例方法创建第一类函数。一旦你探索了函数组合的强大功能,你就会发现OO通常更加冗长。当然,intellisense是好的,但低冗余是最让我头疼的。fsharp已经知道我正在处理一个seq。除了代码缩减,我觉得它更符合流程。然而,面向对象的流程。我想我会使用管道样式作为最佳近似。非常好。不知道林克的把戏。我可能会通过github为志同道合的peep发布一些其他扩展方法。谢谢。这样做的缺点可能值得一提。作为一种习惯性的编码风格,它需要过多的类型注释,与函数相比,它不是惯用的。
open System.Linq

let arr = [| 1 .. 10 |]
let ct = arr.Count()
let arr2 = arr.Select(fun i -> i + 1)
// etc.