當設計一個功能,可考慮從製造它的參數一般收益。要通過迭代傳遞狀態,禁止可變變量,Seq.scan
可能是一個選擇的武器。它摺疊成新狀態的元組和一個選項,然後Seq.choose
去掉狀態和不需要的元素。
在功能構建模塊方面,使其接受謂詞功能'a -> bool
並讓它返回函數seq<'a> -> seq<'a>
。然後
let filterDuplicates predicate =
Seq.scan (fun (flag, _) x ->
let p = predicate x in flag || p,
if flag && p then None else Some x) (false, None)
>> Seq.choose snd
這可以很容易地重用做其他事情,以及像0 together with odd numbers。
filterDuplicates (fun i -> i % 2 = 0) [0..10]
// val it : seq<int> = seq [0; 1; 3; 5; ...]
提供與對等式操作符的調用,並送入的System.String
構造函數,你會得到你想要的簽名,char -> seq<char> -> System.String
附近。
let filterDuplicatesOfChar what s =
System.String(Array.ofSeq <| filterDuplicates ((=) what) s)
filterDuplicatesOfChar '.' "hi. my .name."
// val it : string = "hi. my name"
不熟悉F#但是,您可以通過迭代字符串來創建字符列表。使用Contains方法來檢查一個字符是否已經存在。如果是這樣,跳過,否則添加到列表 – Laazo
Azola的想法看起來不錯,但我建議做一個集合,因爲'List.contains'是O(N)。使用['Set.ofSeq'](https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/set.ofseq%5B't%5D-function-%5Bfsharp%5D),然後你應該能夠在O(1)時間內進行查找。 – rmunn
你能告訴我們你試過了什麼嗎? – TheInnerLight