一个可能更像是咆哮的快速问题(但我希望能有所启发)。
在 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/