在Haskell术语中,什么是monadic效应?

时间:2017-07-11 22:12:46

标签: haskell

我觉得我对monad有很好的理解,但是我不太确定'monadic effects'所指的是什么?这是对monad的评价吗?它与IO有关吗?

2 个答案:

答案 0 :(得分:14)

如果您的M a类型的值为MMonad(或Applicative适用效果),那么效果就是指未包含的信息在a部分。例如,使用IO非常清楚。值IO IntInt,有一些IO效果,例如写入文件或发射导弹。类型Maybe Int的值是Int,其效果可能实际上不包含Int。对于[Int],效果是,您实际上有多个Int

我们称之为效果,因为您可以将Monads和Applicatives视为具有特定效果的计算概念。对于Maybe,效果是您可以提前中止计算,对于[]您可以拆分计算。

答案 1 :(得分:3)

我将尝试以多种方式谈论这个问题,并希望它有所帮助。

"效果" (如"副作用")指的是Monad特定实例的行为,例如State monad表示"有状态计算的效果"使用getput。像mtl这样的Monad变换器库可以被认为是组合效果的方式"。

在此不知道foobar的类型(或实际上正在阅读文档),我们无法说出什么" 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;与你所称的其他语言和副作用相同,即几乎所有可能改变世界状况的东西。