Форматирование свободного / цепочечного кода метода из C # в F # - PullRequest
2 голосов
/ 28 ноября 2010

Некоторые API-интерфейсы, такие как Ninject, используют API-интерфейсы в свободном стиле, например:

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

Когда я пытаюсь отформатировать такой код в F #, компилятор жалуется на пробел между вызовами методов.

Можно ли разместить вызовы метода на отдельных линиях? Я думал о чем-то вроде оператора конвейерной обработки |>, но не совсем уверен, как в этом случае.

Как это отформатировать в F #?

1 Ответ

7 голосов
/ 28 ноября 2010

Вы уверены, что это не работает?

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()) 

Пока у вас есть несколько пробелов, когда вы пытаетесь продолжить одно выражение в несколько строк, все в порядке.

(Обратите внимание, что конвейерная обработка в целом не будет работать, если у вас нет API, предназначенных для этогос параметрами метода карри.)

...