使用System.String.Split from F#

使用System.String.Split from F#,f#,f#-3.0,F#,F# 3.0,我想在F#中使用.NET CLR版本的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 CLR版本的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#中的Split版本与.NET4.5中的版本实现方式不同,因此无法编译。 我想要的.NET版本是:

Split(String[],StringSplitOptions)返回一个字符串数组,该数组包含此字符串中由指定字符串数组的元素分隔的子字符串。参数指定是否返回空数组元素

我知道我得到的是Split的F#版本,它以前位于PowerPack中,这就是实现不同于CLR版本的原因


得到我想要的东西的最好方法是什么?是否可以覆盖Split的F#版本并使用.Net版本?是否可以扩展F#版本?如果可以,如何扩展?

要使用的重载需要第二个参数

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

它不是“F版本的
Split
”,而是你在C中看到的
Split

这里有两个问题:

  • 对于.NET BCL,您需要指定(),因为使用元组以不同的方式声明参数(请参阅)
  • 只有char[]重载不存在StringSplitOptions。如果要使用字符串数组,还需要指定StringSplitOptions

  • 您可以创建自己的F#重载方法,该方法为stringsplitoptions提供默认值。

    Kirelagin是正确的,您尝试使用的字符串拆分方法不存在,它仅适用于没有辅助参数的字符数组。您必须使用此版本:。调用none-f#.NET API时,还必须在参数周围使用括号,因为C#中的参数定义为元组

    当然,您可以在字符串上定义自己的扩展方法,这样您就不必一直指定None,如果这是您预期的默认行为

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

    小修正-在调用带有单个参数的.NET方法时,实际上不必使用括号(但我建议这样做,但这实际上只是风格问题)。对于采用多个参数(一个元组)的方法,您确实需要它们。您的权利托马斯,元组的事情可能会有点麻烦,因为它们实际上只是语法元组(规范中是这么说的:)。我相信这一节“如果没有命名的实际参数,并且M只有一个候选方法,它只接受一个必需的参数,那么忽略arg到元组形式的分解。相反,arg本身是唯一命名的实际参数。”是指当方法只接受一个参数且以未命名形式给出时,您不需要使用括号。AFAIK,PowerPack从未包含任何特殊的(即,特定于F的)String.Split实现。