F#优雅地折叠而没有第一个或最后一个元素?

巴林斯

假设您有一个字符串列表:[“ a”; “ b”; “ c”],您想将其转换为单个字符串,如下所示:“ a,b,c”注意最后一个逗号丢失。我发现这种情况对我来说又一次出现,想一想所有不允许尾随逗号出现的编程语言,并且您正在构建某种代码生成器。我通常会得到如下结果:

let listOfThings = ["a";"b";"c"]
let folded =
    listOfThings
    |> List.map (fun i -> i + ",")
    |> List.fold (+) ""
    |> (fun s -> s.Substring(0, s.Length - 1))

我觉得已经有一些类似fold的功能,因为这似乎是一个基本的用例,我只是想不出它的名字是什么,或者用什么名字来搜索它。

直到

fold从初始状态开始,A递归将折叠功能应用于列表的所有值,在这种情况下,您不需要使用初始状态。

使用reduce会更简单,reduce会将列表的头作为起始状态:

listOfThings |> List.reduce (fun sum cur -> sum + "," + cur) // "a,b,c"

一个较小的缺点是,由于它使用列表头,因此使用空列表调用reduce将会失败。您可以通过检查空白列表来缓解这种情况。

如您所述,没有任何内置函数,我们将为最后一个元素跳过尾随逗号的添加:

let rec join = function
| []    -> ""
| [x]   -> x
| x::xs -> x + ","  + join xs

["a"; "b"; "c"] |> join // a,b,c

但是,最有效的方法是使用String.Join内部使用的方法StringBuilder,同时reduce为每个调用分配一个新的字符串:

String.Join(",", listOfThings) // "a,b,c"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

CSS的第一个/最后一个没有元素的孩子?

LINQ是否有任何简单/优雅的方法将第一个元素放在最后?

在没有第一个和最后一个元素的情况下循环字典

放大没有第一个元素的数组

丢弃 datetimeindex 的所有元素,除了第一个和最后一个

交换数组的所有元素,除了第一个和最后一个

减少ndarray的第一个维度-保留第一个和最后一个元素

如何删除列表的第一个和最后一个元素并返回没有这些元素的列表?

F#,前移第一个参数

有没有办法只选择PROLOG中列表的第一个和最后一个元素?

从最后一个元素到第一个元素添加到数组

C struct指针从第一个元素到最后一个元素的步骤

交替打印最后一个元素和第一个元素(JavaScript)

删除第一个元素,但希望它删除最后一个元素

保留数组的第一个索引元素和最后一个索引元素

为什么列表中没有tail()或head()方法来获取最后一个或第一个元素?

为什么这张地图在组合和转置数据集时没有映射第一个和最后一个元素?

访问列表[F#]列表中的第一个元素

第一个孩子没有选择其类型的第一个

在 CSS 中选择具有特定类的序列的第一个和最后一个元素

获取除第一个和最后一个以外的所有数组元素

内联编辑的ng-repeat,如何使第一个(或最后一个元素)具有editmode = true?

获取f#中列表的最后一个元素

python27 matplotlib:连接的第一个和最后一个元素

仅循环第一个和最后一个元素

遍历numpy ndarray,管理第一个和最后一个元素

Java列表处理第一个和最后一个元素

使用pd.Grouper()获取第一个和最后一个元素

查找大于阈值的NumPy数组的第一个和最后一个元素