Форматирование Fluent/Method Chaining Code из C# в F#
Вопрос
Некоторые API, такие как Ninject, используют беглый стиль API, пример:
Bind<ISomething>()
.To<Something>()
.WithConstructorArgument("arg1", "somevalue")
.OnActivation(x => x.DoSomething())
Когда я пытаюсь отформатировать код, такой, в F# компилятор жалуется на пробеле между вызовами методов.
Можно ли поставить метод вызовы на отдельные линии? Я думал о чем-то вроде оператора трубопроводов |> Но не совсем уверен, как в этом случае.
Как это должно быть отформатировано в F#?
Решение
Вы уверены, что это не работает?
Bind<ISomething>()
.To<Something>()
.WithConstructorArgument("arg1", "somevalue")
.OnActivation(fun x -> x.DoSomething())
(Обратите внимание на одно место перед .
S)
Да, это нормально:
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, разработанных для него с параметрами метода карри.)
Не связан с StackOverflow