在F#中格式化来自C#的流畅/方法链代码

时间:2010-11-28 19:36:32

标签: f# c#-to-f#

像Ninject这样的一些api使用流畅的风格apis,例如:

Bind<ISomething>()
.To<Something>()
.WithConstructorArgument("arg1", "somevalue")
.OnActivation(x => x.DoSomething())

当我尝试在F#中格式化这样的代码时,编译器会在方法调用之间的空白处抱怨。

是否可以将方法调用放在单独的行上?我在想像流水线运算符|&gt;但在这种情况下并不确定如何。

如何在F#中格式化?

1 个答案:

答案 0 :(得分:7)

你确定这不起作用吗?

Bind<ISomething>() 
 .To<Something>() 
 .WithConstructorArgument("arg1", "somevalue") 
 .OnActivation(fun x -> x.DoSomething()) 

(注意.之前的一个空格)

是的,没关系:

type ISomething = interface end
type Something = class end

type Foo() =
    member this.To<'a>() = this   //'
    member this.WithConstructorArgument(s1,s2) = this
    member this.OnActivation(x:Foo->unit) = this
    member this.DoSomething() = ()

let Bind<'a>() = new Foo() //'

let r = 
    Bind<ISomething>() 
        .To<Something>() 
        .WithConstructorArgument("arg1", "somevalue") 
        .OnActivation(fun x -> x.DoSomething()) 

只要在尝试将单个表达式连续到多行时有一些前导空格,就可以了。

(请注意,除非您使用curried方法参数为其设计API,否则流水线操作通常无效。)