2009-02-10 18 views
12

Sto cercando di capire la sintassi corretta per utilizzare l'operatore pipe |> nella creazione di un oggetto. Attualmente sto usando un membro statico per creare l'oggetto e solo per farlo. Ecco la versione semplificata.Utilizzo del simbolo della pipe F # con un costruttore di oggetti

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 

Quello che voglio fare ...

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

è qualcosa di simile possibile? Non voglio duplicare il codice ripetendo il mio costruttore con il membro statico create.

Aggiornamento costruttori sono funzioni di prima classe come di F # 4.0

In F # 4.0 la sintassi corretta è.

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

risposta

15

C'è sempre

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

Uhg, così semplice. Ho provato così tante sintassi diverse e non ho nemmeno pensato di usare un divertimento. Grazie Signore. – gradbot

3

A quanto pare, i costruttori di oggetti non sono componibili. costruttori sindacali discriminati non sembrano avere questo problema:

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

Se si desidera utilizzare la pipeline, la risposta di Brian è probabilmente meglio. In questo caso, prenderei in considerazione il semplice avvolgimento dell'intera espressione con Shape().

+0

Cool, grazie per i chiarimenti. Sto per seguire la strada di Brian per ora solo per amor di costanza. Mi piacciono le funzioni finali con tipi facili da riconoscere. Forse aggiungeranno il supporto per questo in futuro. – gradbot