2013-05-27 11 views
6

Chciałbym użyć wersji .NET CLR z String.split w F #. Konkretnie chciałbym użyć tego kodu:Korzystanie System.String.Split z 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 

To nie skompilować jednak ze względu na fakt (wierzę), że wersja Split w F # jest realizowany inaczej niż w .NET 4.5. Wersja z .NET, którą chciałbym, to:

Split (String [], StringSplitOptions) Zwraca tablicę ciągów zawierającą ciągi w tym łańcuchu, które są rozdzielane przez elementy określonej tablicy łańcuchów. Parametr określa, czy zwracane są puste elementy tablicy.

Rozumiem, że jestem coraz F # wersji Split, który wcześniej mieszkał w PowerPack i dlatego realizacja różni się od wersji CLR.

Jaki jest najlepszy sposób, aby uzyskać to, co chcę? Czy można zastąpić wersję Split platformy F # i użyć wersji .Net? Czy jest możliwe rozszerzenie wersji F #, a jeśli tak, to w jaki sposób?

+0

AFAIK, PowerPack nigdy włączone dowolny specjalne (tj. specyficzne dla F # implementacje) String.Split. –

Odpowiedz

6

Przeciążenie chcesz użyć spodziewa się drugiego argumentu.

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

To nie jest „F # wersja Split”, to jest dokładnie to Split widać w C#.

0

2 rzeczy są problemem tutaj:

  1. NET BCL trzeba podać(), ponieważ parametry deklarowane są w inny sposób za pomocą krotek (Patrz http://msdn.microsoft.com/en-us/library/dd483468.aspx)
  2. Tylko char [] przeciążenie istnieje bez StringSplitOptions. Jeśli chcesz użyć tablicy łańcuchowej, musisz również określić StringSplitOptions.

Można utworzyć własną metodę przeciążania F #, która zapewnia ustawienie domyślne dla opcji stringsplitoptions.

0

Kirelagin ma rację, Split metoda na ciąg próbujesz użyć, nie istnieje, jest ona dostępna tylko dla tablic char bez argumentu dodatkowego. Musisz odwołać się do tej wersji: http://msdn.microsoft.com/en-us/library/tabh47cf.aspx. Trzeba też użyć nawiasów wokół argumentów podczas wywoływania funkcji none-f # .NET apis, ponieważ argumenty w języku C# są zdefiniowane jako krotka.

Mogłabyś przyczyny zdefiniować własną przesuwnych sposób na ciąg, w ten sposób nie trzeba określić żaden cały czas, jeśli jest to Twój oczekiwano domyślne zachowanie

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

Drobna korekta - nie musisz używać nawiasów podczas wywoływania metod .NET, które przyjmują pojedynczy argument (ale polecam, ale to jest tylko kwestia stylu). Potrzebujesz ich do metod przyjmujących wiele argumentów (krotka). –

+0

Prawo Tomas, rzecz krotka można się nieco Harry'ego, ponieważ są one w rzeczywistości tylko składniowych krotki (to co mówi spec: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/ manual/spec.html # _Toc335819028). Wierzę, że w tej sekcji "Jeśli nie ma nazwanych rzeczywistych argumentów, a M ma tylko jedną metodę kandydata, która akceptuje tylko jeden wymagany argument, zignoruj ​​dekompozycję arg do postaci krotki, zamiast tego argument arg jest jedynym nazwanym faktycznym argumentem."jest tym, co określa, że ​​nie potrzebujesz nawiasów, gdy metoda przyjmuje tylko jeden argument i jest podana w formie bez nazwy. –