问题标签 [monads]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
10269 浏览

haskell - 什么时候可以使用 IORef?

一直让我感到困惑的一件事是现在是否是使用 IORef 的好时机。在决定是否将 IORef 用于任务时,是否应遵循任何准则?什么时候是在 IORef 上使用 State monad 的好时机?

0 投票
3 回答
2698 浏览

haskell - 状态单子,随机数序列和单子代码

我试图掌握状态单子,为此我想编写一个单子代码,该代码将使用线性同余生成器生成一系列随机数(可能不好,但我的目的只是学习状态单子,而不是建立一个好的RNG库)。

生成器就是这样(为简单起见,我想生成一个Bools 序列):

不要担心数字,这只是种子的更新规则(根据数字食谱)应该生成Ints 的伪随机序列。现在,如果我想按顺序生成随机数,我会这样做:

好的,所以我可以通过使用 State Monad 来避免这个样板:

最后:

好的,这很好用,并Bool为每个给定的种子给我一个 n 伪随机的列表。但...

我可以阅读我所做的(主要基于这个例子:http ://www.haskell.org/pipermail/beginners/2008-September/000275.html )并复制它来做其他事情。但我认为我无法理解 do-notation 和 monadic 函数(如 replicateM)背后真正发生的事情。

任何人都可以帮助我解决一些疑问吗?

1 - 我试图对 nextVal 函数脱糖以了解它的作用,但我做不到。我猜它会提取当前状态,更新它,然后将状态传递给下一个计算,但这只是基于阅读这个 do-sugar 就好像它是英语一样。

我如何真正将这个函数脱糖到原来的 >>= 并逐步返回函数?

2 - 我无法掌握putandget函数的确切作用。我可以猜到他们“打包”和“解包”状态。但糖背后的机制对我来说仍然难以捉摸。

好吧,非常欢迎有关此代码的任何其他一般性评论。我有时会迷恋 Haskell,因为我可以创建一个可以工作的代码并按照我的预期去做,但我不能像我习惯于使用命令式程序那样“遵循评估”。

0 投票
2 回答
1575 浏览

scala - 在解释器中使用 monad 有什么意义?

我最近发现了这个名为Simple interpreter using monads的小scala 示例

这里一元计算的用途/优势是什么?实际上, theM只不过是一个身份单子。这只是为了给出一个单子语法的例子还是它有重要的影响?

0 投票
3 回答
20192 浏览

haskell - Haskell——“‘do’结构中的最后一条语句必须是表达式”

就像它在标题中所说:什么The last statement in a 'do' construct must be an expression意思?我用我见过的几个例子中的类似结束了我的do块,我得到了一个错误。putStrLn

代码:

0 投票
5 回答
1161 浏览

haskell - 什么编程任务为您提供了 monad 的突破?

在最近一篇关于他写的概率单子的博客文章中,Mark Dominus 写道:“所以我觉得我终于到了,单子明智。”

我的第一个 monadic 程序是使用parsecMaybe monad对Project Euler问题 32的一个尴尬解决方案

当灯终于为你打开时,你在做什么?至少提供您编写的代码的草图。知道您现在所知道的,您将如何改进它以及为什么?

0 投票
18 回答
10475 浏览

java - Option[T] 类的意义何在?

我无法理解Option[T]Scala 中的课堂意义。我的意思是,我看不到Noneover的任何优点null

例如,考虑以下代码:

现在假设,该方法getPerson1返回null,那么display对第一行的调用main必然会失败,并返回NPE。同样,如果getPerson2返回Nonedisplay调用将再次失败并出现一些类似的错误。

如果是这样,那么为什么 Scala 会通过引入新的值包装器(Option[T])而不是遵循 Java 中使用的简单方法来使事情复杂化?

更新:

我已经按照@Mitch的建议编辑了我的代码。我仍然看不到Option[T]. 我必须测试例外情况nullNone两种情况。:(

如果我从@Michael的回复中理解正确,唯一的好处Option[T]是它明确告诉程序员这个方法可以返回 None吗?这是这种设计选择背后的唯一原因吗?

0 投票
3 回答
893 浏览

haskell - monad 转换器和多个 monad 的堆叠

我有f签名f :: [a] -> StateT Int Reader b [c]f'签名的功能f' :: a -> StateT Int Reader b [c]

f 中的计算(非常简化)如下所示:

而代替...我想返回带有单子材料的[c]部分。 是否有可能在不手动展开并再次手动将结果放在一起的情况下实现这一目标?我需要一个 List monad 在我的 monad 堆栈的底部来获取简单的代码吗?Reader Monad 显然不是 MonadPlus 类的实例。x ++[c]y
xy

0 投票
7 回答
5254 浏览

functional-programming - 在纯函数式编程中使用 IO 的 monad 的替代方案是什么?

monads被描述为处理IO的haskell解决方案。我想知道是否还有其他方法可以用纯函数式语言处理 IO。

0 投票
3 回答
1180 浏览

haskell - Using MonadError with Parsec

I'm trying to use MonadError together with Parsec. I've come up with the following code snippet:

However, ret is Left "SomeError", it seems the catchError doesn't have any effect. What's the right way to use MonadError here?

I'd prefer to use MonadError over Parsec's own error handling, as for example when I have:

If parser1 fails here, parser2 will continue, but I'd like to have an exception which aborts the parsing entirely.

0 投票
1 回答
913 浏览

haskell - Haskell 与 ContT、callCC、when 混淆

继续寻求理解 ContT 和朋友的意义。请考虑下面的(荒谬但说明性的)代码:

此代码无法编译。但是,如果用when它下面的注释 k 调用替换 the,它会编译。这是怎么回事?

或者,如果我注释掉 x2 行,它也会编译。???

显然,这是原始代码的提炼版本,因此所有元素都有一个目的。感谢有关正在发生的事情以及如何解决它的解释性帮助。谢谢。