gpt4 book ai didi

Ocaml 元组类型误解

转载 作者:行者123 更新时间:2023-12-04 22:42:28 24 4
gpt4 key购买 nike

显然下面的两种类型是不同的,但为什么呢?

type 'a llist = Nil | Cons of 'a * (unit -> 'a llist)

对比
type 'a llist = Nil | Cons of ('a * unit -> 'a llist)

没有 Cons在这两种情况下都将元组作为参数?

最佳答案

这是一个细微的区别,但表示方式不同。可以在以下示例中看到:

type ta = A of int * int
type tb = B of (int * int)
A是一个带有两个参数的构造函数,而 B是一个带有单个元组参数的构造函数。

您可以通过在运行时检查对象的大小来查看差异:
let size x = 
Obj.size (Obj.repr x)

let () = Printf.printf "%d %d\n" (size (A (2, 3))) (size (B (2, 3)))

这将显示“2 1”——在第二种情况下,只存储了一个指向元组的指针,而元组存储在另一个块中。

这也意味着您可以操作元组本身:
let get_a (A x) = x (* error: The constructor A expects 2 argument(s),
but is applied here to 1 argument(s) *)
let get_b (B x) = x (* works *)

关于Ocaml 元组类型误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42690713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com