在最近一篇关于他写过的概率monad的博客文章中,Mark Dominus写道,"So I feel like I've finally arrived, monadwise."
My first monadic program使用Problem 32和Project Euler来parsec Maybe monad的尴尬解决方案。
当灯光最终为你打开时,你在做什么?至少提供您编写的代码草图。知道你现在知道什么,你会如何改进它?为什么?
答案 0 :(得分:4)
当我意识到我可以使用monad进行解析和interpreting时,我能够在第一次尝试时在F#中为类似LUA的动态编程语言编写我的第一个迷你解释器。一流的延续!,环境,可变状态,调试 - 所有只是一个大的monad变压器堆栈。
答案 1 :(得分:3)
这不是对你的问题的完全犹太回答,因为它不是一个真正的编程任务,但是Learn You A Haskell以非常明确的方式从Functors到应用程序走向Monads,这对我有很大帮助。
答案 2 :(得分:2)
一些基于抽样的随机计算代码。 «m a»类型是«a»类型的随机变量 和«a - > m b»是“随机函数”。 随机变量可以非常简单地以这种方式处理。 «replicateM n»用于从同一变量中获取独立样本。
表示法也很好: x < - y 表示x是来自随机变量y的样本。
答案 3 :(得分:2)
无。在几个月没有试图理解monad并做其他事情之后,下次我想到monad时我注意到我理解它们。 (这往往发生在其他领域。)
为了记录,最有用的是考虑连接而不是(&gt;&gt; =),并且意识到join(:: m(ma) - &gt; ma)基本上是在说“而不是计算我可以运行以生成计算B(我可以运行以获得类型a的值),给我一个新的计算C,它同时运行A 然后生成的B “所以它非常类似于你正在使用的任何Monad的'跑'功能,只有一级。使用fmap,您可以生成类型m(m(m(m(m(ma)))))的计算,使用连接可以将它们展平,并且可以一起创建任意计算顺序(并且'return'是琐碎的计算)。顺序性是Monad捕获的本质。
答案 4 :(得分:1)
对我来说,它是在QuickCheck“Gen”monad上创建一个变体(用于创建随机值)。我想测试一些有状态的东西,所以我把“Gen”改写成monad变换器并将它与状态monad叠加起来。在那里的某个地方灯泡继续。