问题标签 [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 投票
2 回答
815 浏览

haskell - 在 F# 中实现 Haskell-MaybeMonad - 我们如何才能变得如此懒惰?

我们正在尝试在 F# 中从http://www.haskell.org/all_about_monads/html/maybemonad.html构建 Haskell-MaybeMonad 示例。

这个想法是在两个字典中搜索一个邮件地址。如果两个查找之一返回结果,我们将查看第三个。

问题是即使第一次返回结果,我们也会执行第二次查找。Haskell 的好处就在这里,它评估惰性。现在我们在 F# 中寻找类似的东西。我们尝试了以下方法,但它看起来很难看,似乎打破了在构建器中封装可能逻辑的想法:

有更好的解决方案吗?

问候,叉子

0 投票
4 回答
3324 浏览

haskell - Haskell:如何在 State monad 之上编写交互式解释器?

我们正在开发一个在内部使用状态单子的模型文件系统。我们有一个类型类,其操作如下:

我们正在开发一个小型交互式解释器,它将提供诸如cdls、等命令cat。解释器中的操作可以这样写:

Operation和的定义Response并不重要;如果你喜欢,把它们当作字符串。

我要解决的问题是在 I/O monad 中编写一个顶级循环来解释文件系统Operation并打印响应。如果 IO 是 FS 的一个实例(也就是说,如果我们直接使用 IO monad),生活会很简单:我们可以写

但这不是我想要的。我想使用Control.Monad.State

并声明

使用FS抽象,我可以编写一个可以与任何实例一起使用的单步函数,并且确实可以编译以下代码:

在这一点上,我完全被困住了。要做的是在 IO monad 中编写一个交互式循环,它可以读取Operations 和 print Responses,但它适用于不一定是 IO 的状态monad。(有一个不在 IO 中的模型的原因之一是我们可以测试 QuickCheck 属性。)

我觉得这必须是一个标准问题——在一个非有状态抽象之上的交互式读取 - 评估 - 打印循环- 但我一定遗漏了一些非常明显的东西,因为我似乎无法 IO弄清楚。我在网上看过,但没有开悟。

任何帮助编写可以调用的交互式、执行 IO 的计算step将不胜感激。

0 投票
10 回答
5858 浏览

haskell - 非编程术语中的 Monad

可能重复:
什么是单子?

你会如何用非编程术语来描述一个 monad?是否有一些编程之外的概念/事物(在所有编程之外,而不仅仅是 FP)可以说以一种重要的方式行动或像 monad 一样?

0 投票
4 回答
734 浏览

haskell - Monad“绑定”功能问题

如果我这样定义“绑定”函数:

如果我希望结果是新的 Monad 类型,或者我应该使用相同的 Monad 但 b 和以前一样在同一个 Monad 框中,这个定义会对我有帮助吗?

0 投票
5 回答
3565 浏览

haskell - Haskell 的 mapM 不懒吗?

更新:好的,这个问题可能变得非常简单。

为什么这永远不会回来?


mapM 不会懒惰地处理无限列表吗?

下面的代码挂起。但是,如果我用 B 行替换 A 行,它就不再挂起。或者,如果我在 A 行前面加上“splitRandom $”,它也不会挂起。

Q1是:mapM不偷懒吗?否则,为什么用 B 行替换 A 行“修复此”代码?

Q2 是:为什么前面的 A 行和 splitRandom “解决”了这个问题?

该代码懒惰地生成一个无限的随机数列表。然后它生成一个随机数。通过使用 splitRandom,我可以在无限列表之前先评估后一个随机数。如果我在函数中返回 b 而不是 c,则可以证明这一点。

但是,如果我将 mapM 应用于列表,程序现在会挂起。为了防止这种挂起,我必须在 mapM 之前再次应用 splitRandom。我的印象是mapM可以偷懒

0 投票
1 回答
823 浏览

monads - Haskell多参数类型类中的上下文是什么

在 Real World Haskell 的第 15 章中,定义了一个类型类:

几段后,它说 >>= 和 return 不需要定义,因为上下文。但是没有进一步解释上下文的含义。

如果只有“m”是 Monad 的实例,编译器如何知道 MonadSupply 是 Monad 的实例?

0 投票
1 回答
2806 浏览

scala - Scalaz 的 Reader Monad

我尝试用 scalaz 定义 Reader monad,如下所示:

但我得到一个编译器错误:

这是为什么?

谢谢,列维

0 投票
5 回答
10435 浏览

haskell - Haskell Cont monad 如何以及为什么工作?

这就是 Cont monad 的定义方式:

你能解释一下它是如何以及为什么起作用的吗?它在做什么?

0 投票
2 回答
1592 浏览

haskell - Haskell中的mapM严格吗?为什么这个程序会出现堆栈溢出?

以下程序正确终止:

跑步:

然而,给它一个无限列表,程序永远不会终止,并且在编译时,最终会出现堆栈溢出错误!

跑步,

我希望程序在getStdRandom我每次从列表中选择一个项目时都会懒惰地评估,并在这样做 5 次后完成。为什么要评估整个列表?

谢谢。

有没有更好的方法来获得无限的随机数列表?我想将此列表传递给纯函数。

编辑:更多阅读表明该功能

是我一直在寻找的。

EDIT2:在阅读了 camccann 的回答后,我意识到getStdGen每次通话都会获得新的种子。相反,最好将此函数用作简单的一次性随机列表生成器:

但我仍然不明白为什么我的mapM电话没有终止。显然与随机数无关,但mapM可能与此有关。

例如,我发现以下内容也不会终止:

是什么赋予了?顺便说一句,恕我直言,上述randomInts功能应该在System.Random. 能够非常简单地在 IO monad 中生成随机列表并在需要时将其传递给纯函数非常方便,我不明白为什么这不应该出现在标准库中。

0 投票
2 回答
1234 浏览

haskell - 状态单子哈斯克尔

我想写一个函数来使用haskell中的State Monad计算平均值这是我写的代码

我在 GHCI 中编译时遇到了这个错误,我卡在那里你能帮我理解什么是错的,提前谢谢你