2013-05-27 11 views
6

Я хотел бы использовать версию .NET CLR для String.Split в F #. В частности, я хотел бы использовать этот код:Использование System.String.Split из 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 

Это не может скомпилировать однако, в связи с тем (я верю), что версия Split в F # реализуется иначе, чем в .Net 4.5. Версия от .NET, которая мне бы хотелось:

Split (String [], StringSplitOptions) Возвращает строковый массив, содержащий подстроки в этой строке, которые ограничены элементами указанного массива строк. Параметр указывает, следует ли возвращать пустые элементы массива.

Я понимаю, что я получаю версию F # Split, которая ранее находилась в PowerPack, и поэтому реализация отличается от версии CLR.

Каков наилучший способ получить то, что я хочу? Можно ли переопределить версию F # Split и использовать версию .Net? Возможно ли продлить версию F #, и если да, то как?

+0

AFAIK, гидравлические никогда не включал, специальные (т. е. F # -специфические) реализации String.Split. –

ответ

6

Перегрузка, которую вы хотите использовать, ожидает второй аргумент.

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

Это не «F # версия Split», это точно, что Split вы видите в C#.

0

2 вещи здесь проблема:

  1. Для .NET BCL вам необходимо указать(), так как параметры объявляются по-разному с помощью кортежей (см http://msdn.microsoft.com/en-us/library/dd483468.aspx)
  2. Только символ [] перегрузка существует без StringSplitOptions. Если вы хотите использовать строковый массив, вам также необходимо указать StringSplitOptions.

Вы можете создать свой собственный метод перегрузки F #, который предоставляет значение по умолчанию для stringsplitoptions.

0

Kirelagin is right, метод Split на String, который вы пытаетесь использовать, не существует, он доступен только для массивов char без дополнительного аргумента. Вы должны прибегнуть к этой версии: http://msdn.microsoft.com/en-us/library/tabh47cf.aspx. Также вы должны использовать круглые скобки вокруг своих аргументов при вызове none-f # .NET apis, потому что аргументы в C# определяются как кортеж.

Вы могли бы причины определить свой собственный внутренний-метод на строках, таким образом, вы не имеете ни указать None все время, если это ваше ожидаемое поведение по умолчанию

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

Незначительная коррекция - вам действительно не нужно использовать круглые скобки при вызове методов .NET, которые принимают один аргумент (но я бы рекомендовал это, но это действительно вопрос стиля). Вы нуждаетесь в них для методов, принимающих несколько аргументов (кортеж). –

+0

Ваше право Tomas, вещь кортежа может получить немного harry, поскольку они на самом деле являются только синтаксическими кортежами (вот что говорит спецификация: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/ ручной/spec.html # _Toc335819028). Я считаю, что этот раздел «Если нет именованных фактических аргументов, а M имеет только один метод-кандидат, который принимает только один требуемый аргумент, игнорируйте разложение аргумента arg на кортеж. Вместо этого arg сам является единственным фактическим аргументом.»- это то, что указывает, что вам не нужны скобки, когда метод принимает только один аргумент, и он указан в неназванной форме. –

Смежные вопросы