我觉得我对单子有一个很好的理解,但是我不太确定“单子效应”指的是什么?这是单子的评估吗?这与IO有关吗?
我觉得我对单子有一个很好的理解,但是我不太确定“单子效应”指的是什么?这是单子的评估吗?这与IO有关吗?
M a
的值,其中M
是Monad
(或者对于applicative效果是Applicative
),那么所谓的效果是指不包含在a
部分中的信息。例如,在IO
中非常清楚。一个IO Int
类型的值是带有一些IO
效果的Int
值,如写入文件或发射导弹。而类型为Maybe Int
的值是带有可能并不包含Int
的效果的Int
值。对于[Int]
,效果是您实际上拥有多个Int
。Maybe
,效果是您可以提前终止计算;对于[]
,效果是您可以拆分计算。IO Int
的值是带有一些IO
效果的Int
”的措辞。一个IO Int
并不比ls
是文件列表更像一个Int
。更准确地说,将其称为生成Int
的配方会更加准确。 - Rein HenrichsMonad
的一个特定实例的行为,因此,例如,State
monad通过get
和put
表达了“有状态计算”的效应。像mtl
这样的monad transformer库可以被视为“组合效应”的方法。foo
和bar
的类型(或者事实上没有阅读文档)的情况下,我们无法确定这里发生了什么“monadic effects”,即使我们可以说出关于这段代码的很多其他内容。do a <- fmap bar $ foo x
b <- baz
return (a,b)
do
块的类型形式为SomeMonad m=> m (a,b)
。这个被“返回”的元组(a,b)
以及它可以通过>>=
传递给另一个“有副作用的计算”方式,不是我们谈论“效果”时所说的内容。State
的runState
)时,单子效果总是实际发生的。IO
的情况下,只有运行时才能访问特定的run
函数,因此不存在的runIO
函数调用main
来运行您的程序。对于IO
,“单子效应”确实与其他语言中称为“副作用”的内容相同,即几乎可以改变世界状态的任何事情。Maybe
会有任何单子效应吗?它没有任何 run
方法,这会增加一些混淆。 - Chris StryczynskiMaybe
和[]
的情况下回去编辑,但是我没有一个好的快速澄清方法(但是那句话肯定不太准确)。Maybe
表达了可能失败的计算效果(或者在具有null
的语言中进行计算)。 - jberryman