IO Monad在哪个意义上是纯的?

16 浏览
0 Comments

IO Monad在哪个意义上是纯的?

有人向我解释过,IO单子可以被描述为一个状态单子,其中的状态是“真实世界”。支持这种IO方法的人认为,这使得IO操作变得纯净,就像引用透明一样。为什么会这样?在我看来,IO单子内部的代码似乎有很多可观察的副作用。而且,难道不可能将几乎任何非纯函数描述为一个关于真实世界的函数吗?例如,我们不能将C语言中的malloc函数看作是一个接受RealWorld和Int并返回指针和RealWorld的函数,只是像在IO单子中一样,RealWorld是隐含的吗?\n注:我知道什么是单子以及它的用途。请不要回答一个与我的问题无关的随机单子教程链接。

0
0 Comments

IO Monad是Haskell中用于描述命令式程序的DSL(Domain Specific Language)。它通过纯Haskell的数据结构和函数来实现。在这个例子中,我们有一个名为animatePowBoomWhenHearNoiseInMicrophone的函数,它接收两个参数并返回一个程序的描述。这个函数是纯函数,因为对于相同的输入,programA和programB的结果是完全相同的。

在Haskell中,IO是一个Monad,它允许我们在纯函数式的环境中描述命令式的操作。IO Monad的作用是将命令式的操作封装成纯函数,并在需要的时候执行这些操作。在这个例子中,animatePowBoomWhenHearNoiseInMicrophone函数的返回类型是IO (),表示它是一个执行命令式操作的描述。

GHC是Haskell的一个实现,它同时实现了纯Haskell和一个命令式的IO解码器/执行器。通过将IO操作描述为纯函数,我们可以在Haskell的纯函数式环境中使用命令式的操作。

总之,IO Monad是Haskell中用于描述命令式程序的DSL。通过将命令式操作封装成纯函数,我们可以在纯函数式的环境中使用这些操作。这种方式保证了程序的纯度,并且使得程序更加可靠和可测试。

0
0 Comments

IO Monad是Haskell中用于处理副作用的一种特殊类型。函数式编程的核心思想是将程序描述为由小的、独立的计算组成的大型计算。这种独立的计算具有许多优势,包括简洁的程序、高效且可并行化的代码、惰性求值以及对控制流的严格保证。

然而,在某些情况下(比如IO操作),我们需要使用非纯的代码。这些操作涉及的计算无法独立进行,因为它们可能会改变其他计算的任意数据。然而,Haskell始终是纯的,IO并不改变这一点。因此,我们需要给这些非纯、非独立的代码提供一个共同的依赖项 - 我们需要传递一个"RealWorld"。无论我们想要运行什么样的有状态计算,我们都需要将这个"RealWorld"传递给它,以便应用我们的更改 - 任何其他想要查看或修改这个状态的计算也必须知道这个"RealWorld"。

无论是通过显式还是隐式地使用IO monad,都是可以的。我们将一个Haskell程序构建为一个巨大的计算,它转换数据,而其中一部分数据就是"RealWorld"。当你的程序在当前的"RealWorld"参数下运行时,初始的"main :: IO ()"将被调用,这个"RealWorld"将在所有涉及的非纯计算中传递,就像数据在"State"中一样。这就是monadic ">>="(绑定)要处理的。

如果一个IO monad的内容可以是非纯的,那么组合非纯操作的结果怎么可能是纯的呢?你说的没有道理。

内容是非纯的,但容器不是 - IO monad的值就像任何其他数据一样。你没有机会从"IO a"中取出内容(除非是非常不正当的手段),因此无论进行了什么非纯操作,它都被限制在了IO monad内部。

当然,如果你使用unsafePerformIO这样的函数,就可以进行严重的作弊了。

0
0 Comments

在什么意义上,IO Monad是纯粹的?

IO Monad的纯粹性是指它代表的是一个纯粹的值,就像一个字符串一样是一个纯粹的值。它是一种用于创建其他类型的值的“配方”或“程序”。它可以被执行多次,以创建一个值,或者在尝试失败时终止。我们最终想要执行这个配方/程序(否则,为什么要编写一个?),但在我们的代码中,由IO操作所代表的是这个配方本身。

这个配方本身是一个纯粹的值,就像一个字符串一样是一个纯粹的值。配方可以以有趣、有时是惊人的方式进行组合和操作,但是这些配方的组合方式(除了明显的非纯粹的unsafePerformIO、unsafeCoerce等)都是完全引用透明的、确定性的,以及所有这些好的特性。所得到的配方绝对不依赖于除了它所构建的配方之外的任何状态。

“配方”——很好的教学用词。

“教学的”——很好的学习用词,读了你的评论之后学会了这个词。

0