2013-05-27 15 views
6

F # içinde String.Split .NET CLR sürümünü kullanmak istiyorum. Özellikle ben bu kodu kullanmak istiyorum:F System.String.Split kullanarak 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 

Bunun nedeni F # Split sürümü .NET 4.5 olandan farklı uygulanmıştır gerçeği (inanıyorum) için ise derlemek başarısız olur. Kullanmak istediğim .NET sürümü:

Bölme (String [], StringSplitOptions) Belirtilen dize dizisinin öğeleriyle sınırlanan bu dizede bulunan alt dizeleri içeren bir dize dizisi döndürür. Bir parametre boş dizi öğelerini döndürüp döndürmeyeceğini belirtir.

Eskiden PowerPack'de bulunan Split sürümünün F # sürümünü alıyorum ve bu yüzden uygulamanın CLR sürümünden farklı olduğunu anlıyorum.

İstediğimi elde etmenin en iyi yolu nedir? Split'in F # sürümünü geçersiz kılmak ve .Net sürümünü kullanmak mümkün mü? F # versiyonunu genişletmek mümkün mü ve eğer öyleyse, nasıl?

+0

AFAIK beklenen varsayılan davranış ise Hiçbiri her zaman belirtmek gerekmez bu şekilde tanımlamak, PowerPack dahil hiç herhangi String.Split özel (yani, F # -belirli) uygulamaları. –

cevap

6

Kullanmak istediğiniz aşırı yüklenme ikinci bir argüman bekler.

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

Bu bir “Split F # versiyonu” değil, tam olarak C# görüyoruz Split bu.

0

2 şeyler burada sorun şunlardır: parametreler farklı yolu kullanarak dizilerini bildirilmiştir, çünkü (belirtmeniz gerekir NET BCL) için

  1. ] [
  2. Sadece char (http://msdn.microsoft.com/en-us/library/dd483468.aspx bakınız) StringSplitOptions olmadan aşırı yükleme var. Bir dize dizisi kullanmak isterseniz, StringSplitOptions belirtmeniz de gerekir.

Dizeleriçıkarışıklıklar için bir varsayılan olan kendi F # aşırı yükleme yönteminizi oluşturabilirsiniz.

0

Kirelagin haklı, kullanmaya çalıştığınız String'deki Split yöntemi yok, yalnızca ikincil bir argümanı olmayan char dizileri için kullanılabilir. Bu sürüme başvurmanız gerekiyor: http://msdn.microsoft.com/en-us/library/tabh47cf.aspx. Ayrıca, hiçbir # f # .NET apis çağırırken argümanlarınızın etrafında parantez kullanmanız gerekir çünkü C# içindeki argümanlar bir tuple olarak tanımlanır.

Sen neden olabilir String üzerinde kendi abone-yöntemi, bunu

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

Küçük düzeltme - aslında tek bir argüman alan .NET yöntemlerini çağırırken parantez kullanmak zorunda değilsiniz (ancak bunu öneririm, ama bu sadece bir stil meselesidir). Birden fazla argüman (tuple) alarak yöntemler için onlara ihtiyacınız var. –

+0

Doğru Tomas'ınız, tuple olayı biraz sertleşebilir çünkü aslında sadece sözdizimsel tuplelardır (spekülasyon şöyle der: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/ manuel/spec.html # _Toc335819028). Bu bölüme inanıyorum "Eğer adlandırılmış gerçek argümanlar varsa ve M sadece bir argüman kabul eden sadece bir aday yöntemi var, tuple formu için arg ayrıştırma yok. Onun yerine arg kendisi tek adlandırılmış gerçek argüman."Yöntem yalnızca bir argüman aldığında ve isimsiz formda verildiğinde parantezlere ihtiyacınız olmadığını belirtir. –