2013-05-27 62 views
6

我想在F#中使用.NET CLR版本的String.Split。具體來說,我想使用此代碼:使用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#拆分的版本比在.NET 4.5中實現不同。 我想要的.NET版本是:

Split(String [],StringSplitOptions)返回一個字符串數組,它包含此字符串中由指定字符串數組的元素分隔的子字符串。一個參數指定是否返回空數組元素。

我知道我得到了Split的F#版本,它以前駐留在PowerPack中,這就是爲什麼實現與CLR版本不同的原因。

什麼是獲得我想要的最佳方式?是否可以重寫Split的F#版本並使用.Net版本?有沒有可能擴展F#版本,如果是這樣,如何?

+0

據我所知,在PowerPack中從未納入任何String.Split的特殊(即F#特定的)實現。 –

回答

6

要使用的重載需要第二個參數。

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

這不是一個「的Split F#版本」,這正是Split你在C#中看到。

0

兩件事情是這裏的問題:

  1. 對於你需要指定().NET基礎類庫,因爲這些參數在不同的使用方式申報的元組(見http://msdn.microsoft.com/en-us/library/dd483468.aspx
  2. 只有的char []沒有StringSplitOptions存在過載。如果你想使用一個字符串數組,你還需要指定StringSplitOptions。

您可以創建自己的F#重載方法,該方法爲stringsplitoptions提供了默認值。

0

Kirelagin是正確的,您試圖使用的字符串上的Split方法不存在,它只適用於沒有第二個參數的字符數組。你必須訴諸於這個版本:http://msdn.microsoft.com/en-us/library/tabh47cf.aspx。在調用none-f#.NET apis時,還必須在參數周圍使用括號,因爲C#中的參數被定義爲元組。

否則可能會導致的定義字符串上自己的分機,方法,這樣你就不必指定無所有的時間,如果這是你的預期違約行爲

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

微調 - 當調用帶有單個參數的.NET方法時,實際上並不需要使用圓括號(但我會建議,但這實際上只是一個樣式問題)。你需要它們來獲取多個參數的方法(一個元組)。 –

+0

您的權利Tomas,元組事物可能會有點難受,因爲它們實際上只是語法元組(這就是規範所說的內容:http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/手動/ spec.html#_Toc335819028)。我相信這一節「如果沒有命名的實際參數,並且M只有一個只接受一個必需參數的候選方法,那麼忽略arg到元組形式的分解。相反,arg本身是唯一命名的實際參數。「是什麼規定,當方法只需要一個參數並且以未命名的形式給出時,不需要括號。 –