问题标签 [monadplus]

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 投票
1 回答
309 浏览

haskell - 当 Exc 是成员时 Control.Eff 的 MonadPlus 实例

单子变换器中,我们有

可扩展效果中,没有这样的东西

我试过实现它,但徒劳无功。这是我到目前为止所拥有的:

有2个问题:

  • 对于mzero,GHC 抱怨如下:

    为什么 GHC 不e0匹配e

    答案(在评论中提供):开启ScopedTypeVariables

  • for mplus,undefined应该换成 的反函数runExc,但是在extensible-effects的API中找不到。我错过了什么 ?

理由:我希望能够在a <|> b范围内写作Member (Exc e) r => Eff r a,意思是:

  • 尝试a
  • 如果a抛出ea,尝试b
  • 如果b抛出eb,则抛出mappend ea eb

这需要一个Alternative实例,这就是为什么我MonadPlus首先尝试实现一个实例。

注意:我使用的是 GHC 7.8.3 。

预先感谢您的帮助。

0 投票
1 回答
187 浏览

haskell - MonadPlus 的错误处理

在尝试学习一些 Haskell 时再次陷入困境。我正在尝试做的是head/tail为具有错误处理的列表实现一种组合方法。签名必须如下所示:

但是,我对使用 MonadPlus 进行错误处理的方式有点迷茫。我尝试了以下方法:

但它抱怨:预期类型:m(a,[a])实际类型:也许(a,[a])。只是为了好玩,我也试过:

但这不仅看起来多余,而且也不起作用。

任何提示表示赞赏!

0 投票
2 回答
96 浏览

haskell - 无法理解 monad 的错误处理

我正在尝试构建一个函数,它返回列表中的单个元素。该列表是元组的一部分Maybe (Int,[Int])

如果列表不包含任何元素,我想返回一个错误。如果列表正好包含 1 个元素,我想将该元素作为 Monad 返回。如果列表包含超过 1 个元素,我想返回一个错误。

我有点迷茫,看不出如何让这个相当简单的事情发挥作用。这是我到目前为止所拥有的:

不幸的是,我在尝试编译时收到的错误消息对我作为初学者来说绝对没有用..

非常感谢任何帮助!

0 投票
1 回答
107 浏览

haskell - mzero 如何匹配保护类型签名?

我很难理解如何guard工作。为什么要进行类型检查?不能mzero返回一些m a地方a /= ()吗?

0 投票
2 回答
79 浏览

haskell - 在 Aeson 解析器中展平 MonadPlus

我不确定我是否在这里找错了树,但我有一个 AesonFromJSON定义,看起来相当庞大,我想知道它是否可以变成更简洁的东西。如果 URI 的嵌套解析失败,我想缩短整个对象的解析。

parseURIisparseURI :: String -> Maybe URI和 both的类型Maybe以及Parser具有MonadPlus实例。有没有办法将两者直接组合并在最后删除丑陋的case语句?

0 投票
1 回答
324 浏览

haskell - 我们可以用 Alternative 做什么,但不能用 Monoid 做什么?

我读了为什么是 MonadPlus 而不是 Monad + Monoid?我理解理论上的区别,但我无法弄清楚实际的区别,因为对于 List 它看起来是一样的。

是的。也许有不同的实现

但是我们可以像 Alternative 一样实现 Maybe Monoid

那么,有人可以展示解释Alternative和Monoid之间实际区别的代码示例吗?

这个问题不是为什么 MonadPlus 而不是 Monad + Monoid 的重复?

0 投票
2 回答
312 浏览

haskell - Control.MonadPlus.Free 出了什么问题?

免费的MonadPlus定义为

已在免费4.6中删除,并带有以下注释(更改日志):

已删除Control.MonadPlus.Free。改用FreeT f [],结果是中规中矩。

问题是什么,特别是哪些法律不成立?

0 投票
1 回答
583 浏览

haskell - 是否存在渐近优化一系列 MonadPlus 操作的 Codensity MonadPlus?

最近有一个关于DList<->[]Codensity<->之间关系的问题Free

这让我思考是否有这样的事情MonadPlusCodensitymonad 仅对 monadic 操作提高渐近性能,对mplus.

此外,虽然曾经有Control.MonadPlus.Free,但它已被删除以支持FreeT f []. 而且由于没有明确的 free MonadPlus,我不确定如何表达相应的improve变体。也许像

?


更新:我尝试使用回溯LogicTmonad 创建这样的 monad,它似乎以类似于以下方式定义Codensity

并且适用于回溯计算,即MonadPlus.

然后我定义lowerLogic了,类似lowerCodensity如下:

然后,补充相应的MonadFree实例后

可以定义

但是,它有些不对劲,从我最初的实验看来,对于某些示例,k它与improvePlus k. 我不确定,如果这是一个基本的限制,LogicT并且需要一个不同的、更复杂的 monad,或者只是我lowerLogic错误地定义(或其他东西)。

0 投票
1 回答
254 浏览

haskell - 如何使用自由(或更自由)的单子对采用单子参数的动作进行编码?

大多数 monadic 函数采用纯参数并返回一个 monadic 值。但是有一些也需要单子参数,例如:

他们每个人似乎都提出了一个不同的问题,我无法掌握如何使用自由单子对这些动作进行编码的通用方法。

  • 在两者中finallyforkIO问题在于一元参数的类型与结果不同。但是免费的人需要它们是相同的类型,因为IO a被编码类型的类型变量替换,比如data MyFunctor x = Finally x x x,它只会 encode IO a -> IO a -> IO a

    33 行 Haskell 代码中从零到协作线程作者Fork next next用来拳头实现

    然后用它来实现

    其中输入和输出具有不同的类型。但我不明白这是使用某些过程得出的,还是只是一个适用于这个特定目的的临时想法。

  • mplus特别令人困惑:天真的编码为

    分布>>=建议更好的实现更复杂。并且从 free 中删除了 free 的本MonadPlus 实现

    更自由的情况下,它是通过添加来实现的

    为什么是MPlus NonDetEff Bool而不是NonDetEff a a除了使用CoYoneda 函子之外,有没有办法让它与Free我们需要数据类型成为函子一起工作?

  • 因为forkExec我根本不知道如何进行。
0 投票
1 回答
867 浏览

haskell - Haskell 解析器、Monad 和 MonadPlus

这是我的解析器代码。显然我已经完成了“旧方式”并且无法真正让它以新方式工作。您能告诉我需要修复哪些问题才能使其正常工作吗?我阅读了这篇文章(https://wiki.haskell.org/Functor-Applicative-Monad_Proposal)并尝试更改我的代码,但我认为我在这里做错了。

我得到的编译错误:

编辑 //

现在的代码:

错误: