たとえば、「Hello」という単語を文字のリストに分割する場合など、Fシャープで文字列を文字のリストに分割するにはどうすればよいですか。
"Hello" ->['H';'e';'l';'l';'o']
私はSplit([| |])を試しましたが、渡したパラメータに応じて文字列を分割するだけです。
私はこれを試しましたが、それでもうまくいきませんでした
let splitChar (text:string) =
[for c in text ->c]
let splitChar (text:string) =
[for c in text do yield c]
Seq.toList
を使用して、文字列を文字のリストに変換できます。
Seq.toList "Hello"
文字列は、基本的には文字列です implementsIEnumerable<char>
。内部的には、文字列はchar値の配列です。その配列は Chars インデクサーを通じて公開されます。
文字列に対して任意のSeq
メソッドを使用できます。例:
"abc" |> Seq.iter (fun x->printfn "%c" x)
個別のキャラクターも用意されています
String module の最適化された関数を使用することもできます。
"abc" |> String.iter (fun x->printfn "%c" x)
String
モジュールは、String
クラスのメソッドを使用してパフォーマンスを向上させます。たとえば、 String.length 関数はString.Length
プロパティのエイリアスであるため、Seq
のようにすべての文字を反復処理する必要はありません。
let length (str:string) =
let str = emptyIfNull str
str.Length
String.iter などの他の関数は、Chars
インデクサーを直接使用します。
let iter (f : (char -> unit)) (str:string) =
let str = emptyIfNull str
for i = 0 to str.Length - 1 do
f str.[i]
.NETでは、 String.ToCharArray メソッドを使用できます。文字列に戻るには、コンストラクターを関数として使用するF-#を使用して String(Char []) を使用できます。
"Hello".ToCharArray() |> List.ofArray
F#アレイモジュールを使用する方がパフォーマンスが向上する場合があります。 List.ofArray
はList.ofSeq
よりも効率的だと思います。それが問題ではない場合、Chadの回答と同様に、F#の慣用的な方法は次のとおりです。
"Hello" |> List.ofSeq
最初に何かをchar配列またはリストに分割することを最初に考えたが、もっと簡潔にする必要がある場合があることに気づきました。
let msg = "hello-world"
let resultA =
msg.[0..0].ToUpper() + msg.[1..].Replace('-', ' ')
let resultB =
Seq.toList (msg)
|> (fun list -> (string list.Head).ToUpper() + (String.Concat(list.Tail)).Replace('-', ' '))
// val resultA : string = "Hello world"
// val resultB : string = "Hello world"
「resultA」の方がいいと思います。