Haskell 指针是按值传递的吗?

Are Haskell Pointers Pass by Value?

我构造了一个f :: Ptr Int -> IO (Int)类型的函数。

当我传递 f 一些指针 p,然后尝试 free p,我得到一个核心转储。

我的结论是Haskell通过引用传递指针并在函数返回值后自动删除它们!

问题:f被传递p时,它是按值还是按引用? Haskell 是否在函数 returns 之前删除了 p

您不释放指针,而是释放内存,特别是 malloc(和 co.)分配的内存。如果您释放一个指向非 malloc 分配内存的指针,它将失败。如果释放指向已释放的 malloc 分配内存的指针,它也会失败。

When f is passed p, does it do so by value or by reference?

通常 Haskell 中的值是装箱的,除非您专门使用未装箱的类型。他们通常也很懒惰,所以你得到的是一个盒子里面的一个 thunk。我想这符合引用传递的条件。也就是说,这与您的问题完全无关。如果您只是按 value1.

传递未装箱的严格数值,指针的行为不会有任何不同

Does Haskell delete p by the time the function returns?

绝对不是。 Haskell 不会在任何 Ptr 上自动调用 free。在没有垃圾收集 2 的情况下,它甚至无法知道何时可以安全地调用给定指针上的 free


1关于你的问题。

2 现在,当然 Haskell 垃圾收集器,但这不适用于那些值你可以 Ptrs 到。