string - F#,字符序列 -> 字符串

标签 string f# char seq

一个可能更像是咆哮的快速问题(但我希望能有所启发)。

在 F# 中,字符串与 Seq 兼容,这样 "abcd"|> Seq.map f 将适用于字符串。

这是处理字符串的绝佳工具,例如从字符串中获取前 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 或内联 lambda 并使用 new 之类的令人发指的事情:
"abcdef01234567" 
|> Seq.take 5
|> Seq.toArray 
|> fun cs -> new string (cs) (* note you cannot just |> string *)

我希望在语言中看到的(也许是疯狂的)期望是,当 Seq 用于字符串时,结果表达式的类型签名应该是字符串 -> 字符串。意思是,进去的就是出来的。 "abcd"|> Seq.take 3 = "abc"。

在这种情况下,我对高级字符串操作的期望是否有误?

有没有人建议以一种很好的方式解决这个问题,我觉得我一定错过了一些东西。

最佳答案

我只是自己研究这个。我发现 System.String.Concat 工作得很好,例如

"abcdef01234567" |> Seq.take 5 |> String.Concat;;

假设您已打开 System

关于string - F#,字符序列 -> 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14667866/

相关文章:

c# - 查找字符串(或子字符串)在大字符串中出现多少次的最佳方法 C#

python - 在 Python 中将字符串转换为整数

.net - Expecto:记录各个测试状态

Linq 类似函数 GroupMultipleValBy

字符数组自行截断(K&R1-16&1-17)

python - 如何选择某个位置将字符串拆分为 "_"?

python - 如何将字符串变量插入到这个长Python SQL字符串中?

.net - F# 和 "enterprise-level"报告

分配 `ab` 时包含单个字符的字符

java - 如何更改 char 数组中的 2 个以上值?