我想创建一个从1到n的整数列表.我可以使用range(1,n + 1)在Python中执行此操作,在Haskell中使用:take n(iterate(1+)1).
什么是正确的OCaml成语?
Chr*_*way 25
我不知道有哪些成语,但这是一个使用中缀运算符的相当自然的定义:
# let (--) i j =
let rec aux n acc =
if n < i then acc else aux (n-1) (n :: acc)
in aux j [] ;;
val ( -- ) : int -> int -> int list = <fun>
# 1--2;;
- : int list = [1; 2]
# 1--5;;
- : int list = [1; 2; 3; 4; 5]
# 5--10;;
- : int list = [5; 6; 7; 8; 9; 10]
Run Code Online (Sandbox Code Playgroud)
或者,comprehension语法扩展(提供上述语法[i .. j])可能包含在OCaml的"社区版本"的未来版本中,因此可能变得惯用.但是,如果您不熟悉该语言,我建议您不要开始使用语法扩展.
Mic*_*and 13
有了电池,你可以写
let nums = List.of_enum (1--10);;
Run Code Online (Sandbox Code Playgroud)
的--操作者产生从所述第一值到所述第二的枚举.的--^操作者是类似的,但是列举了半开区间(1--^10将枚举从1到9).
The*_*ker 11
干得好:
let rec range i j = if i > j then [] else i :: (range (i+1) j)
Run Code Online (Sandbox Code Playgroud)
请注意,这不是尾递归.现代Python版本甚至有一个懒惰的范围.
如果您打算模拟 的惰性行为range,我实际上建议使用该Stream模块。就像是:
let range (start: int) (step: int) (stop: int): int stream =
Stream.from (fun i -> let j = i * step + start in if j < stop then Some j else None)
Run Code Online (Sandbox Code Playgroud)
小智 5
从上面跟随亚历克斯考文垂,但更短。
let range n = List.init n succ;;
> val range : int -> int list = <fun>
range 3;;
> - : int list = [1; 2; 3]
Run Code Online (Sandbox Code Playgroud)