Module OCaml模块和签名

Module OCaml模块和签名,module,ocaml,signature,Module,Ocaml,Signature,在我的练习中,鉴于OCaml模块的符号,我必须编写它: module type Range = sig type t val range : int * int -> t (*val list_of_range : t -> int list*) end 到目前为止,我的模块包括: module Range = struct type t = int let range (n,m) = if m > n then () else

在我的练习中,鉴于OCaml模块的符号,我必须编写它:

module type Range
 = sig
   type t
   val range : int * int -> t
   (*val list_of_range : t -> int list*)
 end
到目前为止,我的模块包括:

module Range = 
  struct
  type t = int
  let range (n,m) = 
    if m > n then () else (n,m)
  end

range(n,m)的任务是取2个整数,如果n问题来自函数range,则它不能返回单位类型(即())和元组。此外,它违反了签名,您将range定义为返回int的函数。

谢谢,理解了第一部分。我将()替换为(n,m)。但现在我有一个新问题,你提到它违反了签名。函数范围需要给出范围,因此函数范围中的函数列表可以给出从n到m的整数作为列表。在这种情况下,范围输出应该是什么?我建议范围输出一个列表:当m>n或者[n;m]时为空列表。然后,list_of_range以一个范围作为输入,返回一个空列表,或者返回一个int列表。这是因为递归函数必须以一个无效的范围终止,产生(0,0),然后返回[0]。此[0]与所有其他“有效”值合并。如果(0,0)仅在范围无效的情况下出现,则只需将[0]更改为[]。或者,您必须找到另一种方法来区分无效范围和有效范围;使用特定类型。是的,非常感谢!
module type Range
 = sig
   type t
   val range : int * int -> t
   val list_of_range : t -> int list
 end

module Range = 
  struct
  type t = int

  let range (m,n) = 
    if m > n then (0,0) else (m,n)      

  let rec list_of_range (m,n) = 
    let t = range(m,n) in 
    let x = fst(t) in let y = snd(t) in
    if x = 0 && y = 0 then [0] else x :: list_of_range(x+1,y)
  end