C#とVB.NETの文字列処理は簡単ですが、F#で同じようにする方法を理解するのはそれほど簡単ではありません。私は2つのApress F#の本(基礎と専門家)を読んでいます。ほとんどのサンプルは数値計算であり、文字列操作はほとんどないと思います。特に、seq {配列表記}およびのサンプルはである。F#の文字列のシーケンス内の文字列をすべて検索しますか?
私はF#に変換したいC#プログラムを持っています。ここではそれが何をするかです:
- オープンtxtファイル
- 分割ファイルの段落、段落
- スプリット段落線の間にCRLFを探し、探し。 ! ?ラインの間
- 分割ライン言葉は、単語間のスペース「」のために
- 出力段落、行数と言葉
- ループ言葉、検索し、コレクション内の文字列のすべてのocurrencesを数えるのコレクションを見て、マーク見つかった単語の場所。
私はC#でできることの簡単な例ですが、まだF#ではありません。
これはテキストファイルであると仮定します。
受注、2008年3月18日、 、入力された最高裁判所、ニューヨーク州 (ポール・Gの誰か)に持続的な個人 傷害のためのアクションでおり、 が早すぎるとして、拒否された、から訴え限りにおいて、伝えられるところで によって被告の市や 連結マクファーソンの過失、および その請負業者(Mallen)に対する連結McPhersonのサードパーティ アクションを作成したポットホールの上に を旅し、秋、 要約のためのMallenの動き 苦情を解消し、 サードパーティの苦情を全会一致で 、費用なしで確認しました。
当事者は、他に規定又は により、裁判所を通じて手続きコース をチャートに大きな自由度を与えています。したがって、 Mallenは遅れて 提出の口実を提示していないので、Mallenの動きの否定的なものとして の否定を確認します。
私はこの出力を得る:
2 Paragraphs
3 Lines
109 Words
Found Tokens: 2
Token insofar: ocurrence(s) 1: position(s): 52
Token thus: ocurrence(s) 1: position(s): 91
行は文と呼ばれている必要があります:(
いくつかのトークンがあり、私はクラスごとにグループ化され、100以上を言うだろう、私は反復しなければなりません。同じ文章で複数回トークンをマッチさせようとしています。ここでは、文章をどのように分割してListBoxに入れるかを簡単に示しています。そして、私がどのようにしてforeachに頼っているかを示しています。私が避けたいこのアプローチですg可能であればseq {シーケンス式}ととseq.iterまたはList.iterと一致するトークンをすべてリストします。それが必要です。
/// <summary>
/// split the text into sentences and displays
/// the results in a list box
/// </summary>
private void btnParseText_Click(object sender, EventArgs e)
{
lstLines.Items.Clear();
ArrayList al = SplitLines(richTextBoxParagraphs.Text);
for (int i = 0; i < al.Count; i++)
//populate a list box
lstLines.Items.Add(al[i].ToString());
}
/// <summary>
/// parse a body of text into sentences
/// </summary>
private ArrayList SplitLines(string sText)
{
// array list tto hold the sentences
ArrayList al = new ArrayList();
// split the lines regexp
string[] splitLines =
Regex.Split(sText, @"(?<=['""A-Za-z0-9][\.\!\?])\s+(?=[A-Z])");
// loop the sentences
for (int i = 0; i < splitLines.Length; i++)
{
string sOneLine =
splitLines[i].Replace(Environment.NewLine, string.Empty);
al.Add(sOneLine.Trim());
}
// update statistics
lblLineCount.Text = "Line Count: " +
GetLineCount(splitLines).ToString();
// words
lblWordCount.Text = "Word Count: " +
GetWordCount(al).ToString();
// tokens
lblTokenCount.Text = "Token Count: " +
GetTokenCount(al).ToString();
// return the arraylist
return al;
}
/// <summary>
/// count of all words contained in the ArrayList
/// </summary>
public int GetWordCount(ArrayList allLines)
{
// return value
int rtn = 0;
// iterate through list
foreach (string sLine in allLines)
{
// empty space is the split char
char[] arrSplitChars = {' '};
// create a string array and populate
string[] arrWords = sSentence.Split(arrSplitChars, StringSplitOptions.RemoveEmptyEntries);
rtn += arrWords.Length;
}
// return word count
return rtn;
}
実際、これは非常に単純なWindowsアプリケーションです。 1つのRichTextBoxと3つのListBox(段落、行、トークンが見つかりました)、出力を表示するラベル、および1つのボタンを持つフォーム。
よく、はい、分割は同じです。私もregexpを使います。私がわからないことは、段落、行、言葉をどのようにシーケンスに入れるかということです。私はList.iterとseqのサンプルを読みました。iterと私は数字のためにそれを得るが、文字列のためではない。 C#では、ArrayListにすべてを入れて、段落内のforeach段落にあまりにも多く頼っています... foreach line in lines ... foreach word in words ...、そしてトークンのコレクションがあります。 F#でシーケンスやリストを使用して簡単に行う方法は、現在のソリューションの命令的なスタイルを模倣しないようにする必要があります。 – dde
これはF#のリストジェネレータ構文で表現できます。編集私のポスト – Dario