2

次のような文字列処理関数を F# で記述しようとしています。

let rec Process html =
  match html with
  | '-' :: '-' :: '>' :: tail -> ("→" |> List.of_seq) @ Process tail
  | head :: tail -> head :: Process tail
  | [] -> []

いくつかの要素に対する私のパターン マッチング式は少し醜いです (全体'-' :: '-' :: '>')。良くする方法はありますか?また、大きなテキストを処理する場合、私が行っていることは効率的ですか? それとも別の方法がありますか?

明確化:私が言いたいのは、例えば、次のようなものを書くことができるということです:

match html with
| "-->" :: tail -> 
4

5 に答える 5

5

深刻な文字列操作を行うために文字のリストを使用することはおそらく理想的ではないということについて、私は他の人に同意します。ただし、このアプローチを引き続き使用する場合は、求めているものに近いものを取得する1つの方法は、アクティブなパターンを定義することです。例えば:

let rec (|Prefix|_|) s l =
  if s = "" then
    Some(Prefix l)
  else
    match l with
    | c::(Prefix (s.Substring(1)) xs) when c = s.[0] -> Some(Prefix xs)
    | _ -> None

次に、次のように使用できます。

let rec Process html =  
  match html with  
  | Prefix "-->" tail -> ("→" |> List.of_seq) @ Process tail  
  | head :: tail -> head :: Process tail  
  | [] -> []
于 2009-03-26T06:34:44.160 に答える
3

良くする方法はありますか?

もちろん:

let process (s: string) = s.Replace("-->", "→")

また、大きなテキストを処理する場合、私が行っていることは効率的ですか?

いいえ、それは信じられないほど非効率的です。割り当てとガベージ コレクションはコストがかかり、文字ごとに行っています。

それとも別の方法がありますか?

Replaceメンバーを試してみてください。それでもうまくいかない場合は、正規表現を試してください。それでもうまくいかない場合は、字句解析器を作成します (例: を使用fslex)。最終的に、効率のために必要なのは、文字のストリームを処理し、その場で変更することによってその結果を出力するステート マシンです。

于 2010-08-06T10:58:06.023 に答える
2

list <char>や文字列の使用は避けたほうがいいと思います。たとえば、String.Replace、String.Containsなどです。System.StringとSystem.StringBuilderは、list<char>よりもテキストの操作に適しています。

于 2009-02-20T19:56:15.033 に答える
0

この質問は、問題にアプローチする別の方法のアイデアを提供するのに役立つ場合があります- list<> を使用して行を含めますが、各行内で String 関数を使用します。

于 2009-02-23T08:29:27.780 に答える