OCaml模块和签名

时间:2016-01-17 16:29:53

标签: 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 (n,m)
  end

范围(n,m)的任务是取2个整数,如果n <= m,则给出元组(n,m)。除此以外 ()。如果我尝试运行此代码,则会出现错误表达式有&#39; a *&#39; b但表达式需要单位类型。任何人都可以帮助我继续前进吗?

PS。这是我与OCaml的第一天。

PPS。我已经注释了范围列表.. 部分,因为这是练习的第二部分,如果第一部分没有工作,也无法工作。

更新

我已经更新了我的代码,结果似乎很有希望。

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

上面的代码给了我几乎完美的预期结果。如果我给出输入(1,5),结果是[1; 2; 3; 4; 5; 0]。问题是 0 作为列表中的最后一个元素。为什么会有?它来自哪里?

1 个答案:

答案 0 :(得分:1)

问题来自你的函数范围,它不能返回单位类型(即())和元组。此外,它违反了签名,您将range定义为返回int的函数。