2009-02-10 9 views
12

Ich versuche, die richtige Syntax zu finden, um den Pipe-Operator |> in die Erstellung eines Objekts zu verwenden. Momentan benutze ich ein statisches Element, um das Objekt zu erstellen und es einfach zu verbinden. Hier ist die vereinfachte Version.Verwenden des F # -Rohrsymbols mit einem Objektkonstruktor

type Shape = 
    val points : Vector[] 

    new (points) = 
     { points = points; } 

    static member create(points) = 
     Shape(points) 

    static member concat(shapes : Shape list) = 
     shapes 
      |> List.map (fun shape -> shape.points) 
      |> Array.concat 
      |> Shape.create 

Was ich tun möchte ...

static member concat(shapes : Shape list) = 
     shapes 
      |> List.map (fun shape -> shape.points) 
      |> Array.concat 
      |> (new Shape) 

Ist so etwas möglich? Ich möchte Code nicht duplizieren, indem ich meinen Konstruktor mit dem statischen Element create wiederhole.

aktualisieren Konstrukteurs sind erstklassige Funktionen wie von F # 4.0

In F 4.0 # die korrekte Syntax ist.

static member concat(shapes : Shape list) = 
     shapes 
      |> List.map (fun shape -> shape.points) 
      |> Array.concat 
      |> Shape 

Antwort

15

Es gibt immer

(fun args -> new Shape(args)) 
+0

Uhg, so einfach. Ich habe so viele verschiedene Syntaxen ausprobiert und nicht einmal daran gedacht, Spaß zu machen. Danke, mein Herr. – gradbot

3

Offenbar Objektkonstruktoren sind nicht zusammensetzbare. Abgesonderter Union Bauer scheinen nicht, dieses Problem zu haben:

> 1 + 1 |> Some;; 
val it : int option = Some 2 

Wenn Sie die Pipeline, Brian Antwort verwenden möchten ist wahrscheinlich am besten. In diesem Fall würde ich nur den gesamten Ausdruck mit Shape() umschließen.

+0

Cool, danke für die Klarstellung. Ich werde jetzt nur aus Gründen der Konstanz bei Brian bleiben. Ich mag es, Funktionen mit einfach zu erkennenden Typen zu beenden. Vielleicht werden sie dies in Zukunft unterstützen. – gradbot