暴言のような簡単な質問です (しかし、代わりに啓発されることを願っています)。
F# では、"abcd" |> Seq.map f が文字列に対して機能するように、文字列は Seq と互換性があります。
これは、たとえば文字列から最初の 5 文字を取得するなど、文字列を操作するための優れた機能です。
"abcdef01234567" |> Seq.take 5
または、重複する文字を削除します:
"abcdeeeeeee" |> Seq.distinct
問題は、char seq の結果が得られると、これを再度文字列に変換するのが非常に厄介になることです。String.concat "" ではメンバーが文字列である必要があるため、これを何度も行うことになります。
"abcdef01234567"
|> Seq.take 5
|> Seq.map string
|> String.concat ""
プロジェクトの 90% で使用する関数があるほどです。
let toString : char seq -> string = Seq.map string >> String.concat ""
これはやり過ぎだと感じますが、代替手段を探しているとどこでも、StringBuilder やラムダのインライン化、new の使用などの凶悪なことに遭遇します。
"abcdef01234567"
|> Seq.take 5
|> Seq.toArray
|> fun cs -> new string (cs) (* note you cannot just |> string *)
私が言語で見たいと思っている私の (おそらくクレイジーな) 期待は、Seq が文字列で使用される場合、結果の式の型シグネチャは文字列 -> 文字列になるはずです。つまり、入ったものが出てくるということです。"abcd" |> Seq.take 3 = "abc".
この場合、高レベルの文字列操作に対する私の期待が間違っている理由はありますか?
これに良い方法でアプローチするための推奨事項はありますか?何かが欠けているように感じます。