Как преобразовать список строки в список списка строк в F # - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть список источников, который выглядит следующим образом:

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

Anyидеи?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Это не так универсально, но вы можете воспользоваться строковыми операциями, чтобы сделать это более кратко.

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

Принимает исправление Тейлора source, чтобы составить правильный список.

0 голосов
/ 24 апреля 2018

Вы были очень близки, но я думаю, что одной проблемой был ваш 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"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...