在F#中转换字符串

时间:2015-12-25 15:31:44

标签: f#

我正在尝试转换如下文件名:

  

ten_of_clubs.png

  

10_of_clubs.png

但是,我不喜欢我的实施:

updatedFace + "_" + delimitedName.[1] + "_" + delimitedName.[2]

在F#中,如何在不引用所有元素的情况下更改字符串的第一个元素?

示例:

updatedFace + "_" + delimitedName.[1..]

from multiprocessing import Pool

def random_tree(Data):
    return calculation(Data)

pool = Pool(processes=4)
forest = pool.map(random_tree, (Data for i in range(300)))

2 个答案:

答案 0 :(得分:3)

没有理由先构建一个格式化的字符串,然后将其拆分,最后创建一个新的格式化字符串。

假设您的意图是返回None案例中的空字符串,您可以执行以下操作:

let getFile card =
    let digitize candidate = 
        match candidate with
        | "Two" -> "2"
        | "Three" -> "3"
        | "Four" -> "4"
        | "Five" -> "5"
        | "Six" -> "6"
        | "Seven" -> "7"
        | "Eight" -> "8"
        | "Nine" -> "9"
        | "Ten" -> "10"
        | _ -> candidate
    match card with
    | Some c ->
        let face = c.Face |> string |> digitize
        let suit = c.Suit |> string
        sprintf "%s_of_%s.png" face suit
    | None -> ""

在这里,我假设FaceSuit类型覆盖了ToString,而不是依赖于我不知道的名为getUnionTypeName的函数。这使您可以使用内置函数string(只需调用ToString ())。

临时测试:

> Some { Face = Ten; Suit = Clubs } |> getFile;;
val it : string = "10_of_Clubs.png"
> Some { Face = Jack; Suit = Clubs } |> getFile;;
val it : string = "Jack_of_Clubs.png"
> None |> getFile;;
val it : string = ""

digitize函数看起来像是通用函数的候选函数,我想知道BCL在其全局化命名空间中是否还没有类似的东西......否则,我确定有数百个NuGet包实现了这样的功能......

事实证明,已经数百个已经执行此操作的NuGet包,因此我创建了一个名为Numsense的包。有了它,您可以将getFile函数简化为:

open Ploeh.Numsense

let getFile card =
    let digitize candidate = 
        match Numeral.tryParseEnglish candidate with
        | Some i -> string i
        | None -> candidate
    match card with
    | Some c ->
        let face = c.Face |> string |> digitize
        let suit = c.Suit |> string
        sprintf "%s_of_%s.png" face suit
    | None -> ""

答案 1 :(得分:2)

用_分割字符串后,你会得到一系列的部分。数组是可变的集合。您可以通过函数更改First,然后再次_再连接。

let parts = myString.Split [|'_'|]
parts.[0] <- toNumber parts.[0]
String.concat "_" parts