【问题标题】:OCaml modules and signaturesOCaml 模块和签名
【发布时间】:2016-01-17 16:29:53
【问题描述】:

在我的练习中,我必须根据其签名编写 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 表达式具有 'a * 'b 但表达式应为单元类型。任何人都可以帮助我继续前进吗?

PS。这是我使用 OCaml 的第一天。

PPS。我已经注释掉了 list of range.. 部分,因为这是练习的第二部分,如果第一部分不起作用,则无论如何都不会起作用。

更新

我已经更新了我的代码,结果看起来很有希望。

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 作为列表中的最后一个元素。为什么会有?它来自哪里?

【问题讨论】:

  • 这是因为您的递归函数必然以无效范围终止,产生 (0,0) 然后 [0]。此 [0] 与所有其他“有效”值合并。
  • 如果 (0,0) 仅在无效范围的情况下出现,则只需将 [0] 更改为 []。或者您必须找到另一种方法来区分无效范围和有效范围;使用特定类型。
  • 好的,非常感谢!

标签: module ocaml signature


【解决方案1】:

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

【讨论】:

  • 谢谢,第一部分明白了。我将 () 替换为 (n, m)。但现在我有一个新问题,你提到它违反了签名。函数 range 需要给出范围,因此函数 list_of_range 可以给出从 n 到 m 的整数作为列表。在这种情况下,范围输出应该是什么?
  • 我建议该范围输出一个列表:当 m>n 时为空列表,否则为 [n;m]。然后 list_of_range 将一个范围作为输入,要么返回一个空列表,要么返回整数列表。
猜你喜欢
  • 2018-01-13
  • 2017-10-05
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多