生成两个值(OCaml或其他语言)之间给定长度的所有列表

生成两个值(OCaml或其他语言)之间给定长度的所有列表,ocaml,Ocaml,我是ocaml新手,试图编写一些代码来生成两个值之间的所有数字列表 例如,如果我调用此函数generate,我希望获得如下内容: let generate ~min ~max ~length (* Maybe other arguments *) = (* The code *) ;; generate ~min:0 ~max:3 ~length:4;; open Core.Std;; type next_list = | Complete of int list

我是ocaml新手,试图编写一些代码来生成两个值之间的所有数字列表

例如,如果我调用此函数
generate
,我希望获得如下内容:

let generate ~min ~max ~length (* Maybe other arguments *) =
    (* The code *)
;;

generate ~min:0 ~max:3 ~length:4;;
open Core.Std;;

type next_list =
    | Complete of int list
    | Partial of int list
    | Result of (int array) list
;;

let rec next ~r ~min ~max ~l =
    let detox = function | Partial a -> a | _ -> assert false in
    match l with
    | Partial (hd :: tl) when hd <= max -> Partial (hd + 1 :: tl)
    | Partial (hd :: tl) when hd = max + 1 -> next ~r ~min ~max
    ~l:(Partial (min :: (detox (next ~r ~min ~max ~l:(Partial tl))) ))
    | Complete (hd :: tl) when hd <= max -> next ~r:([l] :: r) ~min ~max
    ~l:(Complete (hd + 1 :: tl))
    | Complete (hd :: tl) when hd = max + 1 -> next ~r ~min ~max
    ~l:(Complete (min :: (detox (next ~r ~min ~max ~l:(Partial tl)))))
    (*| Partial [] -> next ~r ~min ~max ~l:(Result r)*)
    | Result a -> Result a
应该回来

[
[0;0;0];
[1;0;0];
[2;0;0];
[3;0;0];
[0;1;0];
以此类推

[3;2;3];
[0;3;3];
[1;3;3];
[2;3;3];
[3;3;3];
]
我已经尝试过这样的代码:

let generate ~min ~max ~length (* Maybe other arguments *) =
    (* The code *)
;;

generate ~min:0 ~max:3 ~length:4;;
open Core.Std;;

type next_list =
    | Complete of int list
    | Partial of int list
    | Result of (int array) list
;;

let rec next ~r ~min ~max ~l =
    let detox = function | Partial a -> a | _ -> assert false in
    match l with
    | Partial (hd :: tl) when hd <= max -> Partial (hd + 1 :: tl)
    | Partial (hd :: tl) when hd = max + 1 -> next ~r ~min ~max
    ~l:(Partial (min :: (detox (next ~r ~min ~max ~l:(Partial tl))) ))
    | Complete (hd :: tl) when hd <= max -> next ~r:([l] :: r) ~min ~max
    ~l:(Complete (hd + 1 :: tl))
    | Complete (hd :: tl) when hd = max + 1 -> next ~r ~min ~max
    ~l:(Complete (min :: (detox (next ~r ~min ~max ~l:(Partial tl)))))
    (*| Partial [] -> next ~r ~min ~max ~l:(Result r)*)
    | Result a -> Result a
opencore.Std;;
键入下一个列表=
|完整的整数列表
|整数列表的部分
|(int数组)列表的结果
;;
让rec下一个~r~最小~max~l=
让detoxin=函数|部分a->a | |->在中断言false
匹配
|部分(hd::tl)当hd部分(hd+1::tl)时
|当hd=max+1->next~r~min~max时部分(hd::tl)
~l:(部分(最小::(解毒(下一个~r~min~max~l:(部分tl)))
|当hd下一个~r:([l]::r)~min~max时完成(hd::tl)
~l:(完成(hd+1::tl))
|当hd=max+1->next~r~min~max时完成(hd::tl)
~l:(完成(最小值::(排毒(下一个~r~min~max~l:(部分tl ')))
(*|部分[]->next~r~min~max~l:(结果r)*)
|结果a->结果a
如有必要,它可以分布在多个功能中,这不是问题。
我还对非ocaml代码或想法感兴趣

谢谢你的帮助

这是我关于Stackoverflow的第一个问题,如果我的问题不清楚,请毫不犹豫地回答。

这里有一个提示:

let count_prefix low high lists =
  ???

let generate min max length =
  let rec recur low high len =
    if len = 0 then []
    else count_prefix low high (recur low high (len - 1)) in
  recur min max length
count\u prefix
应返回一个列表,该列表是
列表的元素
前缀为
。如果
列表
为空,则应将包含编号
的列表返回到
。即:

count_prefix 0 3 [] => [[0]; [1]; [2]]
count_prefix 0 3 [[10];[20]] => [[0; 10]; [0; 20]; [1; 10]; [1; 20]; [2; 10]; [2; 20]]
填写
count\u前缀的定义

这里有一些解决方案: 首先,让我们定义以2个列表l1和l2作为输入,并生成一个列表列表,其中每个元素的l2由l1的1个元素扩充:

 let enumerate l ll = List.fold ~init:[] ~f:(fun op x -> (x::ll)::op) l;;
列举[0;1;2;3][4;5;6];; -:int list=[3;4;5;6];[2;4;5;6];[1;4;5;6];[0;4;5;6]]

现在生成:

   let rec generate length ll =
     if length=1 then List.fold ~init:[] ~f:(fun op x -> [x]::op) ll
     else 
       let result = generate (length-1) ll in
       List.fold ~init:[] ~f:(fun op x -> (enumerate ll x)@op) result;;
用法如下:

generate 2 [1;2;3];; (* instead of generate ~min:1 ~max:3 ~length:2 *)
一些解释: List.fold~init:[]~f:(乐趣op x->[x]::op)ll =>这将创建列表的初始列表(单例)


第二个:获取每个长度为-1的列表并执行枚举。

我尝试了几个递归函数,将head增加到max,然后从尾部添加下一个列表。