C#扩展方法和F#管道转发操作符之间有什么关系?

Ale*_*rey 4 c# extension-methods f#

在使用F#解决一些小问题之后,我发现将C#扩展方法看作是一种转向的方法对我自己很有帮助.进入管道运营商'.

例如,给定一个名为int的Int32s序列,C#代码:

ints.Where(i => i > 0)
    .Select(i => i * i)
Run Code Online (Sandbox Code Playgroud)

类似于F#代码

let where = Seq.filter
let select = Seq.map

ints |> where (fun i -> i > 0)
     |> select (fun i -> i * i)
Run Code Online (Sandbox Code Playgroud)

事实上,我经常认为IEnumerable上的扩展方法只是一个函数库,它提供与F#的Seq模块类似的功能.

显然,管道参数是F#函数中的最后一个参数,但是C#扩展方法中的第一个参数 - 但除此之外,在描述扩展方法或管道转发给其他开发人员时是否存在使用该解释的问题?

我会误导他们,还是一个有用的类比?

kvb*_*kvb 6

我不会进行类比,因为可以调用扩展方法,就好像它是一个实例方法,而管道在语法上显然是完全不同的.另外,F#还有扩展方法(以及扩展属性和事件!),所以我认为真的有可能引起混淆.

但是,我认为管道样式和扩展方法都可以将计算流程描述为一组步骤,这可能与您正在推动的相似性.从概念上讲,如果代码反映了"采用这组内容,只保留满足i> 0的子集,然后将每个中的每一个都对齐"的想法,这很好,这就是用英语描述任务的方式.管道语法和C#扩展方法都允许这种事情.