OCaml 模块和签名
OCaml modules and signatures
在我的练习中,我必须根据其签名编写 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)。除此以外 ()。如果我尝试 运行 这段代码,我会得到错误 The expression has 'a * 'b but an expression was expected of type unit。任何人都可以帮助我继续前进吗?
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 作为列表中的最后一个元素。为什么在那里?它来自哪里?
问题来自您的功能范围,它不能 return 单位类型(即 () )和元组。此外,它违反了签名,您将范围定义为 return 是一个 int 的函数。
在我的练习中,我必须根据其签名编写 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)。除此以外 ()。如果我尝试 运行 这段代码,我会得到错误 The expression has 'a * 'b but an expression was expected of type unit。任何人都可以帮助我继续前进吗?
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 作为列表中的最后一个元素。为什么在那里?它来自哪里?
问题来自您的功能范围,它不能 return 单位类型(即 () )和元组。此外,它违反了签名,您将范围定义为 return 是一个 int 的函数。