2016-03-22 11 views
4

Gibt es eine Möglichkeit, die Funktionsargumente in einem Konstruktor zu benennen?Gibt es eine Möglichkeit, benannte Argumente für eine Funktion in einem F # -Konstruktor anzugeben?

type UnnamedInCtor(foo: string -> string -> bool) = 
    member this.Foo: string -> string -> bool = foo 
    member this.Bar: a:string -> b:string -> bool = foo 
    member this.Fizz = foo 

//Does not compile 
type NamedInCtor(foo: a:string -> b:string -> bool) = 
    member this.Foo: string -> string -> bool = foo 
    member this.Bar: a:string -> b:string -> bool = foo 
    member this.Fizz = foo 

Antwort

1

Ich denke, dass es in F # unmöglich ist, aber können Sie type abbreviations verwenden, wenn Sie dokumentieren wollen, was foo repräsentiert:

// Compiles 
type aToBToC = string -> string -> bool 
type NamedInCtor(foo: aToBToC) = 
    member this.Foo: string -> string -> bool = foo 
    member this.Bar: a:string -> b:string -> bool = foo 
    member this.Fizz = foo 
1

Sie müssten die Funktion in Ihrem Konstruktor, um de-Curry:

type NamedInCtor(a, b) = 
    member this.Foo: string -> string -> bool = a b 
    member this.Bar: string -> string -> bool = a b 
    member this.Fizz = a b 

Beachten Sie, dass a und b sind hier implizit typisiert. Sie sollten dem Compiler so weit wie möglich vertrauen, da er Ihren Code viel lesbarer macht.

Denken Sie daran, Funktionen sind erstklassige Typen und traditionelle Objekte werden abgeraten. Was Sie fragen, ist im Wesentlichen "Kann ich eine beliebige Teilmenge dieses Typs benennen und darauf zugreifen?" Die Antwort darauf ist nein. Wenn Sie dieses Verhalten möchten, müssen Sie Ihre Funktionen strukturieren, um es anzufordern.

+1

Haben Sie dies überprüfen. Es kompiliert nicht. –

+0

Natürlich habe ich nicht;) –

Verwandte Themen