我是函数式编程和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"。那怎么能起作用呢?
答案 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
。