我对IO Monad没有任何问题。但我想了解以下内容:
<?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内容的实现?非常感谢
答案 0 :(得分:5)
Haskell函数与计算不同。
计算是一段命令式代码(可能用C或汇编程序编写,然后编译成机器代码,可直接在处理器上执行),这本质上是有效的,甚至不受其影响。也就是说,一旦运行,计算可以访问和改变任何内存并执行任何操作,例如与键盘和屏幕交互,甚至发射导弹。
相比之下,纯语言中的函数(如Haskell)无法改变任意内存并发射导弹。它只能改变自己的内存部分,并返回其类型中指定的结果。
因此,从某种意义上说,Haskell是无法做任何事情的语言。 Haskell is useless。这是1990年代的一个主要问题,直到IO
被整合到Haskell中。
现在,IO a
值是指向单独准备的计算的链接,最终希望生成a
。您将无法使用纯Haskell函数创建IO a
。所有IO
原语都是单独设计的,并打包成GHC。然后,您可以将这些简单的计算组合成不那么简单的计算,最终您的程序可能会产生任何您想要的效果。
但有一点:纯函数彼此分开,如果你一起使用它们,它们只能相互影响。另一方面,计算可以自由地相互作用(正如我所说,它们通常可以做任何事情),因此可以(并且确实)意外地相互破坏。这就是为什么用命令式语言编写的软件中存在很多错误的原因!因此,在Haskell中,计算保存在IO
。
我希望这至少会消除你的一些困惑。