let f (s:string) =
s.Split('$')
|> Seq.mapi (fun i t -> (if i > 3 || i = 1 then "$" else "") + t)
|> String.concat ""
, а вот еще один, который сканирует каждую char
, используя tail рекурсию и seq
вычислительное выражение:
let f (s:string) =
let rec chars n input = seq {
match Seq.tryHead input with
| Some '$' -> if not(n = 1 || n = 2) then yield '$'
yield! Seq.tail input |> chars (n+1)
| Some c -> yield c
yield! Seq.tail input |> chars n
| None -> ()
}
chars 0 s
|> fun cs -> new string(Seq.toArray cs)
Может быть длиннее , новероятно, более эффективен, чем первый .
Редактировать: Нет, это не более эффективно, и это не хвостовая рекурсия, вероятно, потому что это происходит внутри Вычислительного выражения.