【发布时间】:2017-04-15 03:19:08
【问题描述】:
我了解 Haskell 等纯函数式语言的吸引力,您可以在其中使用 monad 跟踪磁盘 I/O 等副作用。
为什么不是所有的系统调用都被视为副作用?例如,不会跟踪 Haskell 中的堆内存分配(这是自动的)。堆栈分配可能是一个副作用,尽管我不确定它是否有用。这两者都会改变系统的整体状态。
那么,什么是副作用,什么不是?仅仅是最“有用”的东西吗?还是有更理论的基础?
【问题讨论】:
-
我认为最简单的答案是,如果分配是一种副作用,那么很少有东西是“纯粹的”,这会降低这个概念的实用性。纯度没有一个普遍的严格定义。我可以想象一种语言确实将分配视为一种副作用并通过类型系统对其进行管理,这在具有少量内存的系统(即嵌入式系统)上可能非常有用,但我不'目前不知道任何这样的语言。
-
内存分配是一个副作用,如果你想控制它何时发生。请参阅 IORef/STRef/FunPtr 包装器。只是如果它是自动发生的,那么您可以相信您的编译器对此很聪明,因此 Haskell 不会强迫您担心它。
-
@AlexisKing 作为一个偶尔需要为嵌入式系统编写代码的人,这将是一种非常有趣的语言。我想它可以在 Haskell 中编写为 DSL,但作为一种编译效率很高的独立语言会很酷。
-
您无法检测到的不存在。你调用一个函数,你如何检测它是否分配了内存?
-
你会想看看this discussion - 答案是“因为我们不在乎”。是的,将两个不同内存位置中的相同值视为彼此不同是没有用的。
标签: haskell functional-programming monads side-effects