gpt4 book ai didi

functional-programming - OCaml 中的弱多态性

转载 作者:行者123 更新时间:2023-12-04 10:18:53 30 4
gpt4 key购买 nike

我对 OCaml 中的弱多态性有点困惑。

请参阅以下代码段,其中我定义了一个函数 remember :

let remember x =
let cache = ref None in
match !cache with
| Some y -> y
| None -> cache := Some x; x
;;

编译器可以推断出多态类型 'a -> 'a , 和 cache在本地使用。

但是当我把上面的代码修改成
let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
;;

编译器推断弱多态类型 '_a -> '_a ,而且,似乎 cacheremember 的调用之间共享.

为什么编译器会在这里推断出弱多态类型,为什么是 cache共享?

更重要的是,如果我再次更改代码
let remember x =
let cache = ref None in
(fun z -> match !cache with
| Some y -> z
| None -> cache := Some x; x)
;;

编译器推断多态类型 'a -> 'a -> 'acache成为本地使用。为什么会这样?

最佳答案

let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
;;

这里 cache被返回的函数关闭。但是在我们声明 cache 的时候,我们没有关于类型是什么的信息;它将由 x 的类型决定是和 cache是在 remember 时创建的被定义为。

但由于这是一个闭包,我们可以这样做:
> remember 1
1

现在很明显 cache : int option ref因为我们实际上已经在其中存储了一些东西。因为只有一个 cache , remember只能存储一种类型。

在下一个中,您关闭了 2 件事, xcache .由于我们创建了一个新的 cache ref 每次调用 remember该类型可以再次完全多态。类型不是弱多态的原因是我们知道我们要存储 x在里面,我们有 x cache时的s类型被 build 。

关于functional-programming - OCaml 中的弱多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17914428/

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