Использование символа трубы F # с конструктором объекта - PullRequest
15 голосов
/ 10 февраля 2009

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

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

Ответы [ 2 ]

17 голосов
/ 10 февраля 2009

Всегда есть

(fun args -> new Shape(args))
3 голосов
/ 10 февраля 2009

По-видимому, конструкторы объектов не являются компонуемыми. Кажется, что у создателей профсоюзов с дискриминацией такой проблемы нет:

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

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

...