2009-02-10 8 views
12

J'essaie de trouver la syntaxe correcte pour utiliser l'opérateur de tuyau |> dans la création d'un objet. Actuellement, j'utilise un membre statique pour créer l'objet et juste piping à cela. Voici la version simplifiée.Utilisation du symbole de tuyau F # avec un constructeur d'objet

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 

Ce que je veux faire ...

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

Est-ce quelque chose comme cela possible? Je ne veux pas dupliquer le code en répétant mon constructeur avec le membre statique create.

Mise à jour sont Constructors fonctions de première classe comme de F # 4.0

In F # 4.0 la syntaxe correcte est.

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

Répondre

15

Il y a toujours

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

Uhg, si simple. J'ai essayé tellement de syntaxe différente et je n'ai même pas pensé à utiliser un amusement. Merci Monsieur. – gradbot

3

Apparemment, les constructeurs d'objets ne sont pas composable. constructeurs syndicaux discriminées ne semblent pas avoir ce problème:

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

Si vous voulez utiliser le pipeline, la réponse de Brian est probablement le meilleur. Dans ce cas, je considérerais juste envelopper l'expression entière avec Shape().

+0

Cool, merci pour la clarification. Je vais rester fidèle à Brian pour l'instant, par souci de constance. J'aime les fonctions de fin avec des types faciles à reconnaître. Peut-être qu'ils vont ajouter un soutien pour cela à l'avenir. – gradbot

Questions connexes