Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在ocaml中构建INT列表_List_Ocaml_Int - Fatal编程技术网

List 在ocaml中构建INT列表

List 在ocaml中构建INT列表,list,ocaml,int,List,Ocaml,Int,我想写一个函数,在两个整数(包括两个整数)之间建立一个列表 rec myFunc x y将构建一个包含x和y之间的所有整数的列表,包括x和y 就目前的逻辑而言,我有如下内容: let rec buildList i n = let x = i+1 in if i <= n then i::(buildList x n) let iota n m = let oper = if n < m then succ else pred in let rec f1 n m

我想写一个函数,在两个整数(包括两个整数)之间建立一个列表

rec myFunc x y将构建一个包含x和y之间的所有整数的列表,包括x和y

就目前的逻辑而言,我有如下内容:

let rec buildList i n = let x = i+1 in if i <= n then i::(buildList x n)
let iota n m = 
  let oper = if n < m then succ else pred  in 
    let rec f1 n m = if n = m then [n] else n :: f1 (oper n) m in
      f1 n m

let rec buildList i n=let x=i+1 in如果i条件为真,则返回列表
i::(buildList x n)
。如果这不是真的,你会回报什么

else[]
添加到函数中,以在不满足条件时返回空列表。
当您没有任何
else
时,编译器假定它是
else()
(因此出现错误消息)。

如果
缺少
else
条件,则您的

我建议您使用尾部递归函数:

let buildList x y =
  let (x,y) = if x<y then (x,y) else (y,x) in
  let rec aux cpt acc =
      if cpt < x then acc
      else aux (cpt-1) (cpt::acc)
  in aux y []
让buildList x y=

让(x,y)=如果x我的建议,这尊重参数的顺序

let rec iota n m = 
  let oper = if n < m then succ else pred  in 
    if n = m then [n] else n :: iota (oper n) m

Todo:尾部递归

依赖电池组的两个备选方案

使用“展开”,其目的是构建列表

let range ~from:f ~until:u = 
    BatList.unfold f (function | n when n <= u -> Some (n, succ n) | _ -> None)

哇,我完全忽略了这一点。谢谢
let range ~from:f ~until:u = 
    BatList.unfold f (function | n when n <= u -> Some (n, succ n) | _ -> None)
# BatList.of_enum @@ BatEnum.(1--9);;
- : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9]
let buildList i n =
 let rec aux acc i =
   if i <= n then
     aux (i::acc) (i+1)
   else (List.rev acc)
 in
 aux [] i
# buildList 1 3;;
- : int list = [1; 2; 3]
# buildList 2 1;;
- : int list = []
# buildList 0 250000;;
- : int list =
[0; 1; 2; 3; .... 296; 297; 298; ...]