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}