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

问题描述 投票:0回答:1

说您有一个字符串列表:[“ 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的功能,因为这似乎是一个基本的用例,我只是想不出它的名字是什么,或者用什么名字来搜索它。

f# fold
1个回答
1
投票

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

使用表头作为其开始状态的reduce更为简单:

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

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

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

String.Join(",", listOfThings) // "a,b,c"
© www.soinside.com 2019 - 2024. All rights reserved.