gpt4 book ai didi

haskell - 了解副作用 : Is allocating memory a pure operation?

转载 作者:行者123 更新时间:2023-12-02 17:13:46 26 4
gpt4 key购买 nike

我正在学习函数式编程(在 Haskell 中)中的副作用,并且我知道外部效应是在函数外部可观察到的效应,而内部效应从外部是不可见的。

为数据结构分配内存是纯操作吗?副作用必须修改某些状态或与调用函数或外部世界进行可观察的交互。在分配数据结构的情况下,您必须调用一些函数(例如 malloc)为其分配内存。但如果这些函数是在函数内调用的,那么外部世界就无法观察到这一点。即使外部世界被修改(因为为数据结构分配了内存),我也不认为分配数据结构是副作用,因为它是不可观察的。

但是,我不确定我的推理是否正确。任何见解都值得赞赏。

最佳答案

Is allocating memory for a data structure a pure operation?

在 Haskell 中,内存几乎从不由程序员直接分配。从这个意义上说,问题是没有实际意义的:分配内存既不是纯粹的也不是不纯粹的操作,因为分配内存不是一个操作,而是一个实现细节。换句话说,Haskell 中的内存分配对于外部代码(或任何代码)来说是不可观察的,但这不是是因为纯粹性,而是因为语言本身抽象了内存分配的概念。就 Haskell 代码本身而言,不存在内存或内存分配这样的东西。

这很重要,因为它允许编译器在不改变代码含义的情况下进行各种优化。例如,在 Haskell 中,当您对大型数据结构进行微小更改时,您实际上是在复制该结构,而不是修改原始结构,这是极其低效的。但是,编译器通常可以判断是否需要该结构的旧副本,如果不需要,它将编写仅修改原始结构的机器代码。作为另一个例子,小的局部值可以被移动到CPU寄存器或系统堆栈,完全绕过这些值的分配。只要不改变代码的功能,优化器就可以并且将会以任何必要的方式打破纯度规则。在这个级别上,区别根本不重要。

<小时/>

In the case of allocating a data structure, you would have to call some functions (e.g. malloc) to allocate memory for it. But if these functions were called within a function, this wouldn't be observable to the outside world. Even though the outside world is modified (as there is memory allocated for the data structure), I don't think that allocating a data structure is a side-effect since it's not observable.

在某些情况下,内存分配操作可能会暴露给 Haskell 代码。例如,Haskell 绑定(bind)可以通过 FFI 调用使用 malloc 分配内存的 C 函数。 。在这些情况下,绑定(bind)的作者需要决定该函数是“纯”(类型应返回纯值)还是“不纯”(类型应返回 IO 操作)。这是我能想到的主要情况,这个问题的答案具有实用值(value)。

在这种情况下,需要关注的重要事项是:

  • 如果我在任何情况下使用相同的输入运行该函数,它总是会给出相同的输出吗?
  • 如果我用其结果值替换源代码中的函数调用,程序会具有完全相同的行为吗?

如果两个答案都是"is",则它是一个纯函数,否则它是不纯的。这与 C 代码中发生多少杂质无关,只要该杂质在函数外部不可见就可以了。

<小时/>

因此,要真正回答您的问题:这取决于情况。

假设调用了malloc,然后在函数退出之前释放内存。在该函数的执行过程中,分配了零网络内存。所以这个函数是纯粹的。

假设调用malloc,并返回指向已分配内存的指针。这是纯粹的,因为Haskell 只知道指针,而不知道分配的内存本身。如果我们运行这个函数来分配一个 4 字节 block ,然后再次运行它来分配另一个 4 字节 block ,并且 Haskell 认为该函数是纯函数,它可能会用第一个调用的结果(指针)替换第二个调用调用,导致两个调用都返回指向同一 4 字节 block 的指针(这不是您想要的)。因此,该函数必须键入为不纯的 IO 操作。

关于haskell - 了解副作用 : Is allocating memory a pure operation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57211404/

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