如何在 F# 中将一个字符串列表转换为一个字符串列表的列表

3

我有一个源代码列表,看起来像这样:

let source = ["A", "B", "%", "C", "Y", "%"]

我希望遍历每个元素,每次碰到符号“%”时,应将前面列表中的每个元素放入子列表中。结果应如下所示。
let result = [["A", "B"], ["C", "Y"]]

我认为我需要使用列表的折叠函数,但我的结果类型是字符串列表而不是字符串列表列表。

let folder (acc, current) item = 
        match item with
        | "" -> (current @ acc, [])
        | _ -> (acc, current @ [item])

let result = source 
            |> List.fold folder ([], []) 
            |> fun (a,_) -> a

有什么想法吗?

请使用分号而不是逗号作为列表元素的分隔符。 - Roman Motyka
2个回答

6

你非常接近答案了,但我认为问题出在你的source列表实际上是一个包含一个大元组的列表。你必须使用;来分隔列表项。逗号,用于分隔元组中的项目。

let source = ["A"; "B"; "%"; "C"; "Y"; "%"]

然后,对于您的folder函数进行一些微小的更改:
let folder (acc, current) item = 
  match item with
  | "%" -> (acc @ [current], [])
  | _ -> (acc, current @ [item])

现在你可以获得你想要的结果:

let result =
  source 
  |> List.fold folder ([], [])
  |> fst

> val result : string list list = [["A"; "B"]; ["C"; "Y"]]

2

虽然这不是一种通用的方法,但你可以利用字符串操作更简洁地完成此操作。

(String.concat "" source).Split([|'%'|], StringSplitOptions.RemoveEmptyEntries) 
|> List.ofArray 
|> List.map List.ofSeq

假设Taylor对source进行了修复,使其成为一个正确的列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接