2009-03-22 31 views
26

Theo this post, F # hỗ trợ các phương thức mở rộng đối với các cá thể đối tượng và các lớp tĩnh. Ví dụ:Phương pháp mở rộng tĩnh trên mô-đun Seq

module CollectionExtensions = 
    type System.Linq.Enumerable with 
     static member RangeChar(first:char, last:char) = {first .. last} 

open ExtensionFSharp.CollectionExtensions 

Nếu tôi gõ System.Linq.Enumerable., phương pháp tĩnh RangeChar xuất hiện trong cửa sổ Intellisense của tôi.

Tôi muốn thêm phương pháp tĩnh, for_alli, vào mô-đun Seq. Tôi đã sửa đổi mã sau đây ở trên như sau:

module SeqExtensions = 
    type Microsoft.FSharp.Collections.Seq with (* error on this line *) 
     static member for_alli f l = 
      l 
      |> Seq.mapi (fun i x -> i, x) 
      |> Seq.for_all (fun (i, x) -> f i x) 

Mặc dù cả hai đoạn mã có cùng cấu trúc, SeqExtensions không biên dịch. F # làm nổi bật từ Seq và trả về lỗi "Loại" Seq 'không được xác định ".

Làm cách nào để tạo phương pháp mở rộng tĩnh trên mô-đun Seq?

Trả lời

43

Để kéo dài F # mô-đun, chỉ cần tạo ra một mô-đun có cùng tên:

module Seq = 
    let myMap f s = seq { for x in s do yield f x } 

Seq. // see your stuff here alongside normal stuff 
+0

tôi biết mình cần phải được đơn giản, cảm ơn bạn :) – Juliet

+0

Xem: [Loại Extensions (F #)] (https://msdn.microsoft.com/en-us/library/dd233211.aspx) và nhận thấy sự khác biệt giữa 'phần mở rộng nội tại' và' phần mở rộng tùy chọn'. –

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