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)

这样的事情可能吗?我不想通过使用静态成员创建重复我的构造函数来复制代码。

从 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

如果您想使用管道,Brian 的答案可能是最好的。在这种情况下,我会考虑用 Shape() 包裹整个表达式。

于 2009-02-10T06:34:23.190 回答