一个可能更像是咆哮的快速问题(但我希望得到启发)。
在 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"。
在这种情况下,我对高级字符串操作的期望是错误的吗?
有没有人建议以一种很好的方式解决这个问题,我觉得我一定错过了一些东西。