Ocaml 使用记录中的两个字段定义记录中的第三个字段
可以在记录中使用两个字段来定义第三个字段吗?比如说Ocaml 使用记录中的两个字段定义记录中的第三个字段,ocaml,Ocaml,可以在记录中使用两个字段来定义第三个字段吗?比如说 type t = { a : int; b : int; c : int } { a = 1 ; b = 2; c = a * b}; 甚至更好 type t = { a : int; b : int; c = a * b } 或者在Ocaml中有什么影响?我知道你可以很容易地编写一个函数来计算c,而不是把它存储在一个字段中 您提出的两种语法都不适用于我们今天使用的OCaml 您可以编写函数来构造记录: # let mkt a b =
type t = { a : int; b : int; c : int }
{ a = 1 ; b = 2; c = a * b};
甚至更好
type t = { a : int; b : int; c = a * b }
或者在Ocaml中有什么影响?我知道你可以很容易地编写一个函数来计算c,而不是把它存储在一个字段中 您提出的两种语法都不适用于我们今天使用的OCaml 您可以编写函数来构造记录:
# let mkt a b = { a; b; c = a * b };;
val mkt : int -> int -> t = <fun>
# mkt 2 3;;
- : t = {a = 2; b = 3; c = 6}
这是我能想到的最好的方法。如果您想确保每个t都是以字段的特定含义创建的,您可以使用模块系统。私有类型将允许其他人访问该字段,但不允许直接创建或变异,前提是t中存在可变部分 看起来是这样的:
module Foo : sig
type t = private { a : int; b : int; c : int }
val create : int -> int -> t
end = struct
type t = { a : int; b : int; c : int }
let create a b = { a; b; c = a * b; }
end
这是执行不变量的一种非常有效的方法,但它可能有点重。存在一种无效的方法 让我们看看Haskell代码:
data Rec = Rec {a::Int, b::Int, c::Int}
d = Rec {a = 2, b = 3, c = a d * b d}
> d
Rec {a = 2, b = 3, c = 6}
因此,为了在OCaml中模拟相同的情况,我们必须更改位类型:
type t = { a : int; b : int; c : int lazy_t}
> let rec d = {a = 2; b = 3; c = lazy (d.a * d.b)};;
val d : t = {a = 2; b = 3; c = <lazy>}
> Lazy.force d.c;;
- : int = 6
> d
- : t = {a = 2; b = 3; c = lazy 6}
type t = { a : int; b : int; c : int lazy_t}
> let rec d = {a = 2; b = 3; c = lazy (d.a * d.b)};;
val d : t = {a = 2; b = 3; c = <lazy>}
> Lazy.force d.c;;
- : int = 6
> d
- : t = {a = 2; b = 3; c = lazy 6}