从 F# 中的字符串中剥离字符

Stripping chars from string in F#

我是函数式编程和 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"。那么这是如何工作的呢?

正如 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

这个函数的return值为最后一个表达式,Seq.fold removeOneChar str chars.

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