15

オブジェクトの作成にパイプ演算子 |> を使用するための正しい構文を見つけようとしています。現在、静的メンバーを使用してオブジェクトを作成し、それにパイプするだけです。こちらが簡易版です。

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)

このようなことは可能ですか?静的メンバーの作成でコンストラクターを繰り返してコードを複製したくありません。

Update コンストラクターは、F# 4.0 のファースト クラスの関数です。

F# 4.0 の正しい構文は次のとおりです。

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

2 に答える 2

18

いつもある

(fun args -> new Shape(args))
于 2009-02-10T06:21:28.400 に答える
3

どうやら、オブジェクト コンストラクターは構成可能ではありません。識別共用体コンストラクターには、この問題はないようです。

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

パイプラインを使用したい場合は、ブライアンの答えがおそらく最良です。この場合、式全体を Shape( ) でラップすることを検討します。

于 2009-02-10T06:34:23.190 に答える