2013-05-27 3 views
6

F #에서 String.Split의 .NET CLR 버전을 사용하고 싶습니다. 특히이 코드를 사용하고 싶습니다 :F #에서 System.String.Split 사용 #

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 

이 때문에 F 번호에 분할 버전은 닷넷 4.5에있는 것과 다르게 구현된다는 사실 (내가 믿는)에, 그러나 컴파일에 실패. .NET의 버전은 다음과 같습니다.

Split (String [], StringSplitOptions)이 문자열에서 지정된 문자열 배열의 요소로 구분 된 하위 문자열을 포함하는 문자열 배열을 반환합니다. 매개 변수는 빈 배열 요소를 반환할지 여부를 지정합니다.

이전에 PowerPack에 있던 Split의 F # 버전을 얻었으며 이것이 구현이 CLR 버전과 다른 이유입니다.

내가 원하는 것을 얻는 가장 좋은 방법은 무엇입니까? Split의 F # 버전을 덮어 쓰고 .Net 버전을 사용할 수 있습니까? F # 버전을 확장 할 수 있습니까? 그렇다면 어떻게해야합니까?

+0

AFAIK 예상되는 기본 동작 인 경우 없음 모든 시간을 지정하지 않아도이 방법을 정의 파워팩이 포함되지 않습니다 어떤 특수한 (즉, F # 특정) String.Split 구현. –

답변

6

사용하려는 과부하에는 두 번째 인수가 필요합니다.

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

은 그것은 "Split의 F # 버전"아니다, 그것은 정확하게 당신이 C#에서 참조하는 Split입니다.

0

2 가지 문제는 여기에 있습니다 : 매개 변수가 다른 방법으로 사용 튜플에 선언되어 있기 때문에, 당신은 (지정해야 닷넷 BCL)의 경우

  1. ] [
  2. 만 문자 (http://msdn.microsoft.com/en-us/library/dd483468.aspx 참조) StringSplitOptions없이 과부하가 존재합니다. 문자열 배열을 사용하려면 StringSplitOptions도 지정해야합니다.

문자열 표시에 대한 기본값을 제공하는 자체 F # 오버로드 메서드를 만들 수 있습니다.

0

Kirelagin이 맞습니다. 사용하려는 String의 Split 메소드가 존재하지 않습니다. 보조 인수가없는 char 배열에서만 사용할 수 있습니다. 이 버전을 사용해야합니다 : http://msdn.microsoft.com/en-us/library/tabh47cf.aspx. 또한 none-f # .NET API를 호출 할 때 인수 주위에 괄호를 사용해야합니다. C#의 인수가 튜플로 정의되기 때문입니다.

당신은 원인의 수 문자열에 자신의 내선-방법, 당신은 그

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

사소한 수정 - 단일 인수를 사용하는 .NET 메서드를 호출 할 때 실제로 괄호를 사용할 필요는 없습니다 (그러나 권장하지만 스타일은 실제로 중요합니다). 여러 개의 인수 (튜플)를 취하는 메서드에 대해서는이 메서드가 필요합니다. –

+0

당신의 오른쪽 Tomas, 튜플 (tuple)은 사실 구문상의 튜플에 불과하기 때문에 약간 해킹 당할 수 있습니다. (그것이 스펙에서 말하는 것입니다 : http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/ manual/spec.html # _Toc335819028). 이 섹션에서 "이름이 지정된 실제 인수가없고 M이 하나의 필수 인수만을 허용하는 후보 메서드가 하나만있는 경우 인수의 분해 형식을 무시하고 대신 인수 자체가 유일한 인수입니다."는 무엇을 의미합니까? 메소드가 하나의 인수 만 취하고 이름없는 형식으로 주어질 때 괄호가 필요 없다는 것을 의미합니다. –