我正在寻找monads的创造性用途来学习.我已经读过某些地方,例如在AI中使用monad,但作为monad新手,我看不清楚如何.
请提供源代码和示例用法的链接.请不要标准单子.
我已经将IO monad描述为状态monad,状态是"现实世界".这种IO方法的支持者认为,这使IO操作变得纯粹,就像在引用透明时一样.这是为什么?从我的角度来看,IO monad中的代码似乎有很多可观察到的副作用.此外,是不是可以描述几乎任何非纯函数,如现实世界的功能?例如,我们不能想到,比方说,C的malloc是一个函数,它接受一个RealWorld和一个Int并返回一个指针和一个RealWorld,就像在Realmonorld隐含的IO monad中一样?
注意:我知道monad是什么以及它是如何使用的.请不要回复随机monad教程的链接,除非它专门解答我的问题.
我刚才读从以下typeclassopedia约之间的差异Monad和Applicative.我能理解,没有join在Applicative.但是下面的描述看起来含糊不清,我无法弄清楚monadic计算/动作的"结果"究竟是什么意思.所以,如果我把一个值放入Maybe,这使得一个monad,这个"计算"的结果是什么?
让我们更仔细地看一下(>> =)的类型.基本的直觉是它将两个计算组合成一个更大的计算.第一个参数ma是第一个计算.但是,如果第二个论点只是一个mb,那将是无聊的; 那么计算就无法相互交互(实际上,这正是Applicative的情况).因此,(>> =)的第二个参数具有类型a - > mb:这种类型的函数,给定第一次计算的结果,可以产生第二个要运行的计算....直观地说,正是这种能力使用先前计算的输出来决定接下来运行哪些计算使Monad比Applicative更强大.应用计算的结构是固定的,而Monad计算的结构可以基于中间结果而改变.
是否有一个具体的例子说明"能够使用先前计算的输出来决定接下来要运行的计算",Applicative没有?
每当有人承诺"解释monad"时,我的兴趣就会被激怒,只有当被指称的"解释"是一长串的例子时才会被沮丧所取代,这些例子是由一些副手的评论所终止的,即"数学理论"背后的"深奥"在这一点上,"是"太复杂而无法解释".
现在我要求相反的事情.我对类别理论有着扎实的把握,我并不害怕图表追逐,Yoneda的引理或衍生的函子(实际上是在分类意义上的monad和adjunction).
有人能给我一个清晰简洁的定义monad在函数式编程中的含义吗?越少越好的例子:有时一个清晰的概念说明了一百多个胆小的例子.尽管我不挑剔,但Haskell作为演示语言会做得很好.
我有一个问题,一堆monad变压器(甚至一个monad变压器)结束IO.一切都很好,除了在每次动作之前都使用电梯非常烦人!我怀疑这与此无关,但我想我还是会问.
我知道提升整个块,但如果代码实际上是混合类型怎么办?如果GHC投入一些语法糖(例如,<-$= <- lift),这不是很好吗?
我对这三个概念感到非常困惑.
有没有简单的例子来说明Category,Monoid和Monad之间的区别?
如果有这些抽象概念的说明,将会非常有帮助.
我想知道在IO monad尚未发明的时代,Haskell中的I/O是如何完成的.任何人都知道一个例子
编辑:现代Haskell中没有IO Monad可以完成I/O吗?我更喜欢一个适用于现代GHC的例子.
我正在学习Haskell并试图理解Monads.我有两个问题.
据我所知,Monad只是另一个类型类,它声明了与"容器"内部数据交互的方式,包括Maybes,Lists和IOs.用一个概念实现这三个东西似乎很聪明和干净,但实际上,关键在于在一系列函数,容器和副作用中可以进行干净的错误处理.这是正确的解释吗?
其次,副作用问题究竟是如何解决的?使用容器的这个概念,语言基本上说容器内的任何东西都是非确定性的(例如i/o).因为列表和IO都是容器,所以列表与IO等价,尽管列表中的值对我来说似乎非常确定.那么什么是确定性的,有什么副作用?我无法理解一个基本值是确定性的想法,直到你把它放在一个容器中(这与它旁边的一些其他值没有特殊值相同,例如Nothing)它现在可以是随机的.
有人可以直观地解释Haskell如何通过输入和输出来改变状态?我没有看到这里的魔力.
每个其他monad都带有变压器版本,据我所知,变压器的概念是monad的通用扩展.跟随其他变形金刚的构建方式,IOT就像是
newtype IOT m a = IOT { runIOT :: m (IO a) }
Run Code Online (Sandbox Code Playgroud)
我可以在现场组成有用的应用程序:IOT Maybe可以执行IO操作,IOT []也可以不执行任何操作,可以构建一个稍后可以执行的列表sequence.
那么为什么Haskell中没有IO变压器呢?
(注意:我在Haskell Cafe上看过这篇文章,但对它没有多大意义.另外,ST转换器的Hackage页面在其描述中提到了一个可能相关的问题,但没有提供任何细节.)
为什么以及如何具体地说Scala Future不是Monad; 有人请将它与Monad的东西比较,比如选项吗?
我问的原因是Daniel Westheide的Scala新手指南第8部分:欢迎来到未来,我问Scala Future是否是Monad,作者回答说它不是,它已经脱离了基础.我来这里要求澄清.