Seq.map f 将适用于字符串。 这是处理字符串的绝佳工具,例如从字符串中获取前-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:36:18 26 4
gpt4 key购买 nike

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

在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com