问题标签 [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 回答
336 浏览

haskell - 为什么安全的偏函数使用 Maybe 而不是泛化到任何 Monad

我知道有些人认为fail这是一个错误,我明白为什么。(似乎 MonadPlus 是用来代替它的)。fail但只要它存在,部分函数使用andpure而不是Justand似乎是有意义的Nothing。因为这将允许您做您当前可以做的所有事情以及更多,所以类似的东西safeHead可以给您传统的Just/Nothing或者您可以返回[x]/ []

从我所读到的内容MonadPlus来看,它似乎比使用fail. 但我对它的了解不够肯定,而且它也可能涉及拉入 Prelude,这可能是一个好主意,但会比仅使用fail.

所以我想我的问题是为什么部分函数不使用failOR MonadPlus,两者似乎都比使用具体类型更好。

0 投票
1 回答
185 浏览

haskell - 是否有“可能返回 mzero”的名称?

有固定的名称maybe mzero return吗?

它具有以下类型:

并转换为Nothing失败和.Just areturn a

0 投票
1 回答
135 浏览

haskell - 非确定性合并排序不会按字典顺序排列排列

我一直在尝试复制Christiansen、Danilenko 和 Dylus 在即将到来的 ICFP 2016 的论文All Sorts of Permutations (Functional Pearl)中提到的一个旁白。第 8 节(“最后的评论”)声称,通过选择一个特定的非确定性谓词,一元合并排序可以按字典顺序产生序列的所有排列。

我们只考虑了非确定性谓词coinCmp,而还有其他可用于影响枚举顺序的非确定性谓词。例如,以下函数将谓词cmp提升到非确定性上下文。

当我们使用这个函数来提升一个比较函数并将它传递给一个单子版本的归并排序时,我们得到了一种特殊的排列函数:它按字典顺序枚举排列。

我很确定我在这里写的是合并排序,但是在运行时排序并不像宣传的那样。

以及实际的字典顺序供参考——

0 投票
2 回答
113 浏览

haskell - Haskell 函数的作用取决于 monad 类型

我正在尝试实现一个通常将列表的第一个元素放入 monad 的函数,但如果 monad 是一个列表,它会返回整个列表:

应该返回Just 1,并且

应该返回[1,2,3]

有任何想法吗?

0 投票
1 回答
525 浏览

haskell - 为什么 `guard` 没有用 MonadPlus 约束定义?

我目前正在阅读 wikibooks 中的 Alternative/MonadPlus 类型。它很好地描述了差异。然而,一个令人费解的部分是guard我假设的函数用于“短路”计算。(我对吗?)

该函数guard虽然在中定义,但Control.Monad有一个Alternative约束,如下所示(链接)。

但是上面的文章提到只MonadPlus需要执行左零和右零定律(因此更强的主张)。

鉴于guard函数的目的,不应该用MonadPlus约束来定义它吗?guard如果应该“短路”计算,我们是否不需要更强大的法律?我很好奇具体设计选择背后的原因。

ps:我不知道除了“短路”这个词之外,还有什么更好的方式来描述“取消前期计算”的行为?

0 投票
2 回答
174 浏览

haskell - Haskell 中 MonadPlus 的默认类型评估是什么?

我有以下代码:

如果我对coin :: Maybe Int解释器进行评估,它会优先级Just 0。这是正常的,因为将 Maybe 实现为 MonadPlus 的实例。

如果我对解释器进行评估coin :: [Int],它会打印[0, 1],因为mpluson list 的实现是append.

coin但是,如果我在没有任何类型装饰器的情况下评估0. 为什么?解释器“转换”什么类型coin来评估它?

此代码摘自:http ://homes.sice.indiana.edu/ccshan/rational/S0956796811000189a.pdf

0 投票
1 回答
283 浏览

haskell - MonadPlus IO 不是幺半群

实例MonadPlus IO是唯一的,因为mzero抛出:

因此,MonadPlus IO 意味着它也适用于错误。

mzero如果其他动作不抛出,显然用作标识元素:

但是当两个动作都抛出时它不会:

所以MonadPlus IO不是幺半群。

如果MonadPlus在用户意图错误时违反法律,那么它的实际目的是什么?

0 投票
1 回答
236 浏览

list - 列表的另一种选择

现在有几次,我发现自己在定义:

当然,这是一个关联操作,空列表[]既是左标识又是右标识。它的功能类似于 Python 的or.

在我看来,这会做得很好(<|>),比(++)会更好。选择第一个非空列表感觉更像是我对命名类型类的期望,Alternative而不是连接列表。诚然,它并不适合MonadPlus,但我认为这是为救赎付出的小代价。我们已经拥有(++)(<>)在标准库中;我们是否需要另一个同义词,或者一个新功能(据我所知)会更有帮助?

起初我认为这可能是一个很好的Alternative例子ZipList,但是在这个答案之后对相关问题的讨论让我信服了。除了向后兼容和保持MonadPlus明智之外,对于当前实例而不是这个新实例还有什么论据?

0 投票
1 回答
62 浏览

haskell - 使用 Logic monad 回溯使用 exceptT 引发的异常

我想使用Logicmonad 来确保错误抛出代码(在 monad 堆栈中,包括ExcepT)在抛出错误时回溯。这是一个简单的例子:

这不会回溯;它不会产生任何结果。lift (msum ...)我可以通过取消选择操作(即使用而不是现在的普通msum调用)使其回溯。但是,出于各种原因,我希望能够在ExceptTmonad 中编写代码,并且基本上只是将MonadPlus实例从 Logic monad 提升到转换后的版本。我试图在这里编写一个自定义MonadPlus实例来完成此操作:

相同的代码也适用于该Alternative实例。但是,这实际上并没有帮助。它仍然没有回溯。这个实例有问题吗?有没有更好的方法来解决这个问题?我在尝试做一些没有意义的事情吗?在一天结束时,我总是可以举起所有东西,但宁愿避免这样做。

编辑:一直在搞砸一些。如果我MonadPlus使用上面的实例,则可以使用mplus,但如果像上面那样使用,则无法使用...msum

0 投票
3 回答
198 浏览

haskell - 从保证至少包含一个 Just 的 [Maybe Bool] 中获得一个 Bool

我有一个 type 的输入list 和一个 type的[Maybe SomeType]谓词,我想回答“谓词是否适用于所有恰好在输入中的 s?”这个问题。.pSomeType -> BoolpSomeType

第一部分很简单:(map . fmap) p list[Maybe Bool].

一个重要信息是我知道length list >= 1并且all isNothing list == False两者都成立,所以必须至少有一个Just Truein (map . fmap) p list

但是我如何Bool从该列表中取出一个单曲呢?

我认为我可以利用折叠(例如 via foldl)和Maybe' 的MonadPlus实例,执行以下操作:

但这并不完全正确,因为如果它不管是什么都mplus返回左操作数,所以即使它的输入是也会返回。Just somethingsomethingallTrueOrNothingTrue[Just True, Just False]

我可以完成任务的最干净/最惯用的方式是什么?

我看到我可以简单地filter取出Nothings,然后将 sand放在一起Just,如下所示:

但我更想知道是否有办法让这些Maybe Bools 表现得像Monoid知道它的Bool内容一样。