![]() |
1
78
采用以下迷你语言:
下面是一个打印“xy”的程序,然后要求输入两个字母并按相反顺序打印:
这是我的类型
伊奥在哈斯克尔的作品相似。尽管 执行
用像C这样的语言你可以写一个函数
添加结果值
上一个
这些是IO操作,可以以某种结果结束。这样的值:
有类型
评估和执行是有区别的。您可以计算任何Haskell表达式,并得到一个值;例如,将2+2::Int求值为4::Int。只能执行类型为IO a的Haskell表达式。这可能有副作用;执行
不 副作用-你只做了评估,这是无害的。
变成IO值?
固定一些字符,说“v”。现在
这在数学上也是有道理的。在C中,
头等舱
这些IO值是一流的。就像你可以有一个整数元组列表一样
IO操作的元组:第一个读取字符并将其打印为大写,第二个读取字符并返回小写。
一个IO值,它读取一个字符
它获取一个IO操作列表,并返回一个按顺序执行它们的IO操作。 单子
单子是一些组合词(如
注意,单子对纯度不是必需的-你可以像我上面所做的那样编写程序。 纯度
在哈斯克尔,如果你有
由于纯度,编译器有更多的自由度,可以更好地优化。它可以重新安排计算,而在C语言中,它必须考虑这是否会改变程序的含义。 |
![]() |
2
9
重要的是要明白,没有什么固有的特殊单子,所以他们肯定不代表阿吉特出狱卡在这方面。实现或使用monad不需要编译器(或其他)魔法,它们是在Haskell的纯函数环境中定义的。特别地, sdcvvc |
![]() |
3
6
计算机系统“在黑板数学之外”的推理意味着什么?那是什么样的推理呢?航位推算?
我们可以通过给它第二个论点,一个世界,并要求它在完成时传递给我们一个新的世界,使每一个影响函数的方面都变得纯粹。我不知道
在我们新的“纯风格”中,我们的处理方式如下:
事实上,每个Haskell IO操作都是这样工作的。
第一个问题很简单。只要我们不允许观察这个世界,我们就不必费心在里面储存任何东西。我们只需要确保一个新的世界不等于任何一个以前的世界(以免编译器恶意优化一些产生世界的操作,就像在
至于世界被混为一谈,我们想把经过图书馆的世界藏起来,这样就没有办法得到世界,也就没有办法把它们混为一谈。原来,单子是在计算中隐藏“旁道”的好方法。输入IO单子。
http://www.reddit.com/r/haskell/comments/8bhir/why_the_io_monad_isnt_a_dirty_hack/ |
![]() |
4
4
我对函数式编程非常陌生,但以下是我对它的理解:
它们由main函数返回。 简而言之,Haskell程序是一个函数,由其他函数组成,它返回一个命令式程序。Haskell程序本身是纯粹的。显然,这个命令式的程序本身是不可能的。现实世界的计算机从定义上讲是不纯的。 这个问题还有很多,其中很多是语义问题(人类,而不是编程语言)。单子也比我在这里描述的要抽象一些。但我认为这是一个有用的方式来考虑它的一般。 |
![]() |
5
4
我是这样想的:程序必须与外部世界做一些事情才能有用。当你(用任何语言)编写代码时,正在发生的(或应该发生的)是,你努力编写尽可能多的纯的、没有副作用的代码,并将IO限制在特定的地方。 我们在Haskell中看到的是,你被更多地推向写作的这个方向,以严格控制效果。在核心和许多库中,也有大量的纯代码。哈斯克尔真的很关心这件事。哈斯克尔的单子在很多方面都很有用。它们的用途之一是围绕处理杂质的代码进行限制。
如果我理解你说的是对的,我不认为这是假的,也不认为这只是在我们的头脑中,像“出狱免费卡”。这里的好处是非常真实的。 |
![]() |
6
4
对于sdcwc构建IO的扩展版本,可以查看Hackage上的IOSpec包: http://hackage.haskell.org/package/IOSpec |
![]() |
7
1
是
Haskell 1.2
. 那时候
哪里:
Haskell中使用一元接口的I/O的出现改变了这一切——不再是可见的数据类型,只是一个抽象的规范。结果呢,怎么办
正如欧文·斯蒂芬斯在书中所说 Approaches to Functional I/O
招来这么多恶名。。。 |
![]() |
8
-2
不,不是。IO monad是不纯的,因为它有副作用和可变状态(Haskell程序中的竞争条件是可能的,所以?呃。。。纯FP语言不知道“种族条件”之类的东西。真正纯粹的FP是干净的唯一性类型,或者Elm是FRP(函数反应式编程)而不是Haskell。哈斯克尔是个大谎言。 证明:
|