关于Haskell IO Monad中的(执行时)

时间:2018-01-23 22:39:47

标签: function haskell io

我对IO Monad没有任何问题。但我想了解以下内容:

  1. 在All / almost Haskell教程/教科书中,他们一直说getChar不是一个纯函数,因为它可以给你一个不同的结果。我的问题是:谁说这首先是一个功能。除非你给我执行这个功能,并且我研究了这个实现,我不能保证它是纯粹的。那么,那个实现在哪里?
  2. 在All / almost Haskell教程/教科书中,据说<?php $string = '07:00 - 06:00 ... ... ... '; $times = substr($string, 0, 13); // assuming your string format is always the same $timeArr = explode(' - ', $times); $starttime = $timeArr[1]; $endtime = $timeArr[0]; echo $starttime . ' - ' . $endtime; ?> 是一个动作(当执行时)它可以返回一个String类型的值。这很好,但是这个执行发生的人/地点。当然!计算机正在执行此操作。这也没关系。但由于我只是一个初学者,我希望你原谅我问,这个“执行”的配方在哪里。我猜它不是用Haskell编写的。毕竟,这个后来的想法是否意味着将Haskell程序转换为类似C的程序,最终将转换为程序集 - &gt;机器代码?如果是这样,哪里可以找到Haskell中IO内容的实现?
  3. 非常感谢

1 个答案:

答案 0 :(得分:5)

Haskell函数与计算不同。

计算是一段命令式代码(可能用C或汇编程序编写,然后编译成机器代码,可直接在处理器上执行),这本质上是有效的,甚至不受其影响。也就是说,一旦运行,计算可以访问和改变任何内存并执行任何操作,例如与键盘和屏幕交互,甚至发射导弹。

相比之下,纯语言中的函数(如Haskell)无法改变任意内存并发射导弹。它只能改变自己的内存部分,并返回其类型中指定的结果。

因此,从某种意义上说,Haskell是无法做任何事情的语言Haskell is useless。这是1990年代的一个主要问题,直到IO被整合到Haskell中。

现在,IO a值是指向单独准备的计算的链接,最终希望生成a。您将无法使用纯Haskell函数创建IO a。所有IO原语都是单独设计的,并打包成GHC。然后,您可以将这些简单的计算组合成不那么简单的计算,最终您的程序可能会产生任何您想要的效果。

但有一点:纯函数彼此分开,如果你一起使用它们,它们只能相互影响。另一方面,计算可以自由地相互作用(正如我所说,它们通常可以做任何事情),因此可以(并且确实)意外地相互破坏。这就是为什么用命令式语言编写的软件中存在很多错误的原因!因此,在Haskell中,计算保存在IO

我希望这至少会消除你的一些困惑。