我有一个源列表,看起来像:
let source = ["A", "B", "%", "C", "Y", "%"]
Run Code Online (Sandbox Code Playgroud)
我想浏览每个元素,每次点击标记"%"时,前面列表中的每个元素都应该进入子列表.结果应该是这样的.
let result = [["A", "B"], ["C", "Y"]]
Run Code Online (Sandbox Code Playgroud)
我想我必须使用list的fold函数,但我的结果类型是字符串列表而不是字符串列表
let folder (acc, current) item =
match item with
| "" -> (current @ acc, [])
| _ -> (acc, current @ [item])
let result = source
|> List.fold folder ([], [])
|> fun (a,_) -> a
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
你非常接近,但我认为一个问题是你的source
列表实际上是一个包含一个大元组的列表.您必须将列表项分开;
.逗号,
用于分隔元组中的项目.
let source = ["A"; "B"; "%"; "C"; "Y"; "%"]
Run Code Online (Sandbox Code Playgroud)
然后对您的folder
功能进行一些细微更改:
let folder (acc, current) item =
match item with
| "%" -> (acc @ [current], [])
| _ -> (acc, current @ [item])
Run Code Online (Sandbox Code Playgroud)
您现在可以获得所需的结果:
let result =
source
|> List.fold folder ([], [])
|> fst
> val result : string list list = [["A"; "B"]; ["C"; "Y"]]
Run Code Online (Sandbox Code Playgroud)