2009-02-10 24 views
12

Tôi đang cố gắng tìm ra cú pháp đúng để sử dụng toán tử đường ống |> vào việc tạo đối tượng. Hiện tại tôi đang sử dụng một thành viên tĩnh để tạo đối tượng và chỉ đường ống đến đó. Đây là phiên bản đơn giản.Sử dụng ký hiệu ống F # với một hàm tạo đối tượng

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 

Những gì tôi muốn làm ...

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

là một cái gì đó như thể này? Tôi không muốn lặp lại mã bằng cách lặp lại hàm tạo của tôi với thành viên tạo tĩnh.

Cập nhật Constructors là chức năng hạng nhất như F # 4.0

Trong F # 4,0 cú pháp đúng là.

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

Trả lời

15

Luôn luôn

(fun args -> new Shape(args)) 
+0

Uhg, thật đơn giản. Tôi đã thử rất nhiều cú pháp khác nhau và thậm chí không nghĩ đến việc sử dụng một niềm vui. Cảm ơn ngài. – gradbot

3

Rõ ràng, nhà thầu đối tượng không phải là composable. Các nhà thầu công đoàn bị phân biệt dường như không có vấn đề này:

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

Nếu bạn muốn sử dụng đường ống, câu trả lời của Brian có lẽ là tốt nhất. Trong trường hợp này, tôi sẽ xem xét việc chỉ gói toàn bộ biểu thức bằng Shape().

+0

Tuyệt vời, cảm ơn bạn đã làm rõ. Tôi sẽ gắn bó với cách của Brian bây giờ chỉ vì lợi ích hằng ngày. Tôi thích các hàm kết thúc dễ dàng nhận ra các loại. Có lẽ họ sẽ thêm hỗ trợ cho điều này trong tương lai. – gradbot

Các vấn đề liên quan