2016-04-16 171 views
4

我是功能編程和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」纔會在代碼中使用它。那麼這個如何工作呢?

+3

'chars'不是函數的最後一行。它只是一個非常長的函數,所以他們把它分成幾行。它確實是'Seq.fold str chars'。因爲''這麼長時間就是爲了可讀性而完成的。把它全部放在一條線上,然後運行它來查看。 –

+0

我現在明白了,非常感謝! –

+0

如果你在大字符串上使用它,那麼爲每個要刪除的字符調用String.Replace兩次會很慢。如果你有一個非常大的輸入,並且有一小部分要去掉的字符,這個函數會遍歷一個小的字符列表,而大量的輸入會遍歷很多次,這正好是向後的。對於小的輸入字符串,當然,這並不重要,除非這個函數被稱爲很多。 –

回答

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

+0

感謝您的解釋!您重新格式化的功能就像一個魅力,確實更具可讀性。 –