如何将字符列表的子列表写为[‘1’; '2'; '3'; ”; ”; '4'; '5'; ”; '6'], 至 = [['1'; '2'; '3']; ['4'; '5']; ['6']]

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

我目前正在学习 Ocaml,即使我可以创建一个没有空格的列表,如 ['1';'2';'3';'4';'5';'6'],我也无法创建子列表。我找不到我的问题的任何来源,所以也感谢您的解释。

type chiffre = int (*0-9*);;
type chiffreCar = char (* '0' - '9'*)
type  nombre = chiffre list;;
type txtnb =  chiffreCar list ;;

let rec les_nb (a:txtnb) : txtnb = 
  match a with
  | [] -> []
  | ' ' :: tl -> les_nb(tl)
  | hd::tl ->hd :: les_nb(tl) ;;
pattern-matching ocaml
1个回答
0
投票

我们可以使用左折叠来迭代列表并将其分组,让我们有机会轻松跟踪添加到输出列表中的最后一个项目。

这将向后构建结果列表,我们将得到一些空格重复的空列表,但我们可以轻松反转这些列表并过滤掉空列表。

# let lst = ['1'; '2'; '3'; ' '; ' '; '4'; '5'; ' '; '6'];;
val lst : char list = ['1'; '2'; '3'; ' '; ' '; '4'; '5'; ' '; '6']
# let rec group lst =
    lst  
    |> List.fold_left 
         (fun i x ->
            match i, x with
            | [], ' ' -> i
            | _, ' ' -> [] :: i
            | [], _ -> [[x]]
            | y::ys, _ -> (x :: y) :: ys)
         []
    |> List.filter @@ (<>) []
    |> List.rev
    |> List.map List.rev;;
val group : char list -> char list list = <fun>
# group lst;;
- : char list list = [['1'; '2'; '3']; ['4'; '5']; ['6']]
© www.soinside.com 2019 - 2024. All rights reserved.