当前位置:  开发笔记 > 编程语言 > 正文

什么是OCaml习惯用语相当于Python的范围函数?

如何解决《什么是OCaml习惯用语相当于Python的范围函数?》经验,为你挑选了3个好方法。

我想创建一个从1到n的整数列表.我可以使用range(1,n + 1)在Python中执行此操作,在Haskell中使用:take n(iterate(1+)1).

什么是正确的OCaml成语?



1> Chris Conway..:

我不知道有哪些成语,但这是一个使用中缀运算符的相当自然的定义:

# 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的"社区版本"的未来版本中,因此可能变得惯用.但是,如果您不熟悉该语言,我建议您不要开始使用语法扩展.



2> Michael Ekst..:

有了电池,你可以写

let nums = List.of_enum (1--10);;

--操作者产生从所述第一值到所述第二的枚举.的--^操作者是类似的,但是列举了半开区间(1--^10将枚举从1到9).


@aneccodeal No. OCaml不允许运算符以'.'开头.(虽然它们可能在第一个字符后包含'.').运算符允许的字符在OCaml的词法文档中定义:http://caml.inria.fr/pub/docs/manual-ocaml/lex.html

3> Thedric Walk..:

干得好:

let rec range i j = if i > j then [] else i :: (range (i+1) j)

请注意,这不是尾递归.现代Python版本甚至有一个懒惰的范围.


不完全 - Python范围(1,3)返回[1,2]而你的(范围1 3)返回[1; 2; 3].将>更改为> =.
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有