Форматирование Fluent/Method Chaining Code из C# в F#

StackOverflow https://stackoverflow.com/questions/4298626

  •  29-09-2019
  •  | 
  •  

Вопрос

Некоторые 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, разработанных для него с параметрами метода карри.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top