2013-05-27 25 views
6

Tôi muốn sử dụng phiên bản .NET CLR của String.Split trong F #. Cụ thể, tôi muốn sử dụng mã này:Sử dụng System.String.Split từ F #

let main argv = 
    let s = "Now is the time for FOO good men to come to the aide of their country" 
    let sepAry = [|"FOO"; "BAR"|] 
    let z1 = s.Split sepAry 
    0 // return an integer exit code 

Tuy nhiên, điều này không thể biên dịch được vì phiên bản Split trong F # được thực hiện khác với phiên bản .Net 4.5. Phiên bản từ .NET mà tôi muốn là:

Tách (String [], StringSplitOptions) Trả về một mảng chuỗi chứa các phần tử trong chuỗi này được phân cách bởi các phần tử của một mảng chuỗi được chỉ định. Tham số chỉ định có trả về các phần tử mảng trống hay không.

Tôi hiểu rằng tôi đang nhận phiên bản Chia tách F #, trước đây đã cư trú trong PowerPack và đó là lý do tại sao việc triển khai khác với phiên bản CLR.

Cách tốt nhất để có được những gì tôi muốn là gì? Có thể ghi đè lên phiên bản F # của Split và sử dụng phiên bản .Net không? Có thể mở rộng phiên bản F # và nếu có, làm thế nào?

+0

AFAIK, các PowerPack không bao giờ có bất kỳ đặc biệt (ví dụ, triển khai F # cụ thể) của String.Split. –

Trả lời

6

Tình trạng quá tải bạn muốn sử dụng dự kiến ​​đối số thứ hai.

let z1 = s.Split (sepAry, System.StringSplitOptions.None) 

Nó không phải là một “F # phiên bản của Split”, đó là chính xác điều đó Split bạn nhìn thấy trong C#.

0

2 điều là những vấn đề ở đây:

  1. Đối với NET BCL bạn cần phải xác định(), vì các thông số được khai báo trong cách sử dụng các bộ khác nhau (Xem http://msdn.microsoft.com/en-us/library/dd483468.aspx)
  2. Chỉ char [] quá tải tồn tại mà không có StringSplitOptions. Nếu bạn muốn sử dụng một mảng chuỗi, bạn cũng cần phải chỉ định StringSplitOptions.

Bạn có thể tạo phương thức quá tải F # của riêng mình, phương thức này cung cấp mặc định cho các chuỗi ký tự.

0

Kirelagin là đúng, phương pháp tách trên chuỗi cố gắng sử dụng của bạn không tồn tại, nó chỉ có sẵn cho mảng char không có đối số thứ cấp. Bạn phải sử dụng phiên bản này: http://msdn.microsoft.com/en-us/library/tabh47cf.aspx. Ngoài ra, bạn phải sử dụng dấu ngoặc đơn xung quanh đối số của bạn khi gọi không có f # .NET apis vì các đối số trong C# được định nghĩa là một bộ tuple.

Bạn có thể nguyên nhân xác định phần mở rộng-phương pháp riêng của bạn trên String, bằng cách này bạn không cần phải chỉ định Không tất cả các thời gian nếu đó là hành vi mặc định dự kiến ​​của bạn

type System.String with 
    member x.Split(separator : (string [])) = x.Split(separator, System.StringSplitOptions.None) 
+1

Chỉnh sửa nhỏ - bạn không thực sự phải sử dụng dấu ngoặc đơn khi gọi các phương thức .NET có một đối số (nhưng tôi khuyên bạn nên làm như vậy, nhưng đó thực sự chỉ là vấn đề về kiểu). Bạn cần chúng cho các phương thức lấy nhiều đối số (một tuple). –

+0

Đúng Tomas của bạn, điều tuple có thể nhận được một chút harry kể từ khi họ là trong thực tế chỉ có tuples cú pháp (đó là những gì spec nói: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/ manual/spec.html # _Toc335819028). Tôi tin rằng phần này "Nếu không có đối số thực sự được đặt tên, và M chỉ có một phương thức ứng cử viên, chỉ chấp nhận một đối số được yêu cầu, bỏ qua sự phân rã của arg thành hình thức tuple."là những gì xác định rằng bạn không cần dấu ngoặc đơn khi phương thức chỉ nhận một đối số và nó được đưa ra dưới dạng chưa đặt tên. –

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