在F#中从字符串中去除字符

时间:2016-04-16 18:07:56

标签: .net string f# fold

我是函数式编程和F#的新手,确实有很多关于如何在F#中执行此操作(从字符串中删除特定字符)的信息,但我遇到了以下函数,并希望得到一些帮助来准确理解发生了什么:

let stripchars chars str =
  Seq.fold
    (fun (str: string) chr ->
      str.Replace(chr |> Char.ToUpper |> string, "").Replace(chr |> Char.ToLower |> string, ""))
    str chars

我通过在我定义的分割函数中调用它来使用stripchars函数:

let split (str : string) =
    ((stripchars "?,.,!,," str).Split ' ') |> Array.toList

我现在很难理解的是,在函数stripchars中,当参数" chars"传递,包含要从字符串str中删除的字符序列,它甚至不在代码中使用,直到最后一行" str chars"。那怎么能起作用呢?

1 个答案:

答案 0 :(得分:4)

正如Guy Coder在上述评论中指出的那样,函数体具有非正统的格式。如果将累加器函数提取到内部嵌套函数,它可能更具可读性:

let stripchars chars str =
    let removeOneChar (str : string) chr =
        str.Replace(chr |> Char.ToUpper |> string, "").Replace(chr |> Char.ToLower |> string, "")
    Seq.fold removeOneChar str chars

此函数的返回值是最后一个表达式Seq.fold removeOneChar str chars

removeOneChar函数的类型为string -> char -> string