我觉得我对monad有很好的理解,但是我不太确定'monadic effects'所指的是什么?这是对monad的评价吗?它与IO有关吗?
答案 0 :(得分:14)
如果您的M a
类型的值为M
和Monad
(或Applicative
适用效果),那么效果就是指未包含的信息在a
部分。例如,使用IO
非常清楚。值IO Int
是Int
,有一些IO
效果,例如写入文件或发射导弹。类型Maybe Int
的值是Int,其效果可能实际上不包含Int
。对于[Int]
,效果是,您实际上有多个Int
。
我们称之为效果,因为您可以将Monads和Applicatives视为具有特定效果的计算概念。对于Maybe
,效果是您可以提前中止计算,对于[]
您可以拆分计算。
答案 1 :(得分:3)
我将尝试以多种方式谈论这个问题,并希望它有所帮助。
"效果" (如"副作用")指的是Monad
的特定实例的行为,例如State
monad表示"有状态计算的效果"使用get
和put
。像mtl
这样的Monad变换器库可以被认为是组合效果的方式"。
在此不知道foo
和bar
的类型(或实际上正在阅读文档),我们无法说出什么" monadic effects"正在这里发生,即使我们可以说这个代码还有很多其他的东西:
do a <- fmap bar $ foo x
b <- baz
return (a,b)
上面的do
块的格式为SomeMonad m=> m (a,b)
。那个&#34;返回&#34;的元组(a,b)
,以及它可以传递给另一个&#34;有效计算的方式&#34;使用>>=
时,并不是我们在谈论&#34;效果&#34;时所说的。
Monadic效果实际上总是&#34;发生&#34;当你run
时(例如通过runState
调用State
)。
在IO
的情况下,只有运行时可以访问run
的特定IO
函数,因此不存在的runIO
函数调用main
来运行你的计划。对于IO
&#34; monadic效果&#34;与你所称的其他语言和副作用相同,即几乎所有可能改变世界状况的东西。