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

问题描述 投票:3回答:2

我有一个源列表,看起来像:

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

我想浏览每个元素,每次点击标记“%”时,前面列表中的每个元素都应该进入子列表。结果应该是这样的。

let result = [["A", "B"], ["C", "Y"]]

我想我必须使用list的fold函数,但我的结果类型是字符串列表而不是字符串列表

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

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

有任何想法吗?

list f#
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

假设泰勒对source的修正使它成为一个正确的列表。

© www.soinside.com 2019 - 2024. All rights reserved.