Подтвердить что ты не робот

Использование символа трубы F # с конструктором объекта

Я пытаюсь выяснить правильный синтаксис, чтобы использовать оператор трубы | > в создании объекта. В настоящее время я использую статический член, чтобы создать объект и просто подключиться к нему. Вот упрощенная версия.

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

Что я хочу сделать...

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

Что-то вроде этого возможно? Я не хочу дублировать код, повторяя свой конструктор со статическим элементом create.

Обновление Конструкторы являются первоклассными функциями с F # 4.0

В F # 4.0 правильный синтаксис.

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

Ответ 1

Всегда

(fun args -> new Shape(args))

Ответ 2

По-видимому, конструкторы объектов не являются составными. У конструкторов дискриминационного объединения, похоже, нет этой проблемы:

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

Если вы хотите использовать конвейер, ответ Брайана, вероятно, лучше всего. В этом случае я бы рассмотрел просто обертывание всего выражения с помощью Shape().