我想创建一个从1到n的整数列表.我可以使用range(1,n + 1)在Python中执行此操作,在Haskell中使用:take n(iterate(1+)1).
什么是正确的OCaml成语?
我不知道有哪些成语,但这是一个使用中缀运算符的相当自然的定义:
# 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 =# 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]
或者,comprehension语法扩展(提供上述语法[i .. j]
)可能包含在OCaml的"社区版本"的未来版本中,因此可能变得惯用.但是,如果您不熟悉该语言,我建议您不要开始使用语法扩展.
有了电池,你可以写
let nums = List.of_enum (1--10);;
的--
操作者产生从所述第一值到所述第二的枚举.的--^
操作者是类似的,但是列举了半开区间(1--^10
将枚举从1到9).
干得好:
let rec range i j = if i > j then [] else i :: (range (i+1) j)
请注意,这不是尾递归.现代Python版本甚至有一个懒惰的范围.