我正在试图找出使用管道运算符的正确语法|>进入一个对象的创建。目前我正在使用静态成员来创建对象,并且只是为了管道。这是简化版。
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
答案 0 :(得分:17)
总是
(fun args -> new Shape(args))
答案 1 :(得分:3)
显然,对象构造函数不可组合。被区分的联合构造函数似乎没有这个问题:
> 1 + 1 |> Some;;
val it : int option = Some 2
如果你想使用管道,Brian的答案可能是最好的。在这种情况下,我会考虑用Shape()包装整个表达式。