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

haskell - 在haskell中构建一个非确定性的monad转换器

我想在 haskell 中构建一个不确定的 monad 转换器,我相信它的行为与 ListT 和http://www.haskell.org/haskellwiki/ListT_done_right提出的替代 ListT 不同。其中第一个将 monad 与项目列表相关联;第二个将 monad 与单个项目相关联,但具有给定元素中的 monadic 动作影响列表后续槽中的 monadic 元素的属性。目标是建立一个单子变压器的形式

这样列表中的每个元素都有自己的 monad 与之关联,并且连续的元素具有独立的 monad。在这篇文章的最后,我稍微演示了这个 monad 应该给出的那种行为。如果您知道如何获得 ListT 的一些变体来提供这种行为,那也会很有帮助。

下面是我的尝试。它不完整,因为unpack函数未定义。我该如何定义它?这是定义它的一次不完整的尝试,但它没有处理 monad m 包含EmptyAmb 列表的情况:

完整(不完整)代码:

期望行为示例

在这里,基本单子是State Int

谢谢。

更新:为什么 LogicT 不做我想做的事的一个例子。

这是 LogicT 在上面的简单示例中所做的:

0 投票
1 回答
221 浏览

haskell - 在 ErrorT 之上为变压器定义 MonadPlus 实例

我想定义一个 monad 转换器,除其他外,它赋予基本 monad 错误功能。如果基本 monad 是,则转换后的 monad 应该是 MonadPlus 的一个实例,但我不知道如何定义 MonadPlus 实例,以便 ErrorT 转换器返回多个答案(如果有多个答案)。我的两次尝试都在下面的代码中。在代码的末尾,有一个语句显示如果基本 monad 是 monad 转换器应该如何表现[]。谢谢。

0 投票
1 回答
237 浏览

haskell - 这个 Haskell 函数是否被称为/实现为另一个名称?

我发现很多我自己拼凑起来的东西似乎很有用,实际上有一个我不知道的标准实现,所以很好奇是否有人可以说他们以前见过这种类型的东西:

它接受一个单子函数并将其折叠,直到一个谓词被替代选择,然后它返回谓词的结果:

我意识到这个名字是一个前奏冲突,我可能会用别的名字来命名它,但我想我会先看看在我不知道的标准库中是否已经有类似的功能......

此外,我想我很好奇我写的组合替代方案是否在其他地方定义,或者这些功能中的任何一个似乎一开始就被误导了。但我的问题的症结是,这是在其他地方实现的,还是在其他地方实现的非常相似的东西

0 投票
3 回答
2369 浏览

haskell - mplus 必须始终是关联的吗?Haskell wiki vs. Oleg Kiselyov

Haskell wikibook断言

MonadPlus 的实例需要满足几个规则,就像 Monad 的实例需要满足三个 monad 定律一样。... 最重要的是 mzero 和 mplus 形成一个幺半群。

其结果是它mplus必须是关联的。Haskell wiki同意。

然而,Oleg 在他的众多回溯搜索实现之一中写道

定义 non-associative 是否符合规定mplus?前两个链接非常清楚地表明如果不是关联的,您就没有真实的MonadPlus实例。mplus但是如果Oleg这样做了……(另一方面,在该文件中,他只是定义了一个名为 的函数mplus,并没有声称那 mplusof mplusMonadPlus如果这是正确的解释,他选择了一个非常令人困惑的名称。)

0 投票
3 回答
5133 浏览

haskell - Monoid vs MonadPlus

我对两者都很陌生MonadsMonoids最近还了解到MonadPlus. 从我所见,Monoid两者MonadPlus都提供了一种具有关联二元运算和标识的类型。Monoid(我将其称为数学术语中的半群。) 那么和之间有什么区别MonadPlus

0 投票
1 回答
177 浏览

haskell - Control.MonadPlus.Free 没有不必要的分发

我正在尝试使用一个免费的 monad 来构建一个 EDSL,用于构建像 Prolog 这样的 AND/OR 决策树,>>=映射到 AND,并mplus映射到 OR。我希望能够描述类似的东西A AND (B OR C) AND (D OR E),但我不希望分配性把它变成(A AND B AND D) OR (A AND B AND E) OR (A AND C AND D) OR (A AND C AND E). 最终,我想将 AND/OR 节点转换为约束求解器中的具体约束,而不会导致我希望求解器处理的备选方案数量的组合爆炸。

in Control.MonadPlus.Free,Plus ms >>= f导致f应用于Pure每个 monad 下的每个叶子ms。这是必要的,因为它可能会为它替换f的每个叶子产生不同的值。Pure

但是,在 中Plus ms >> gg不受 的任何叶子影响ms,因此将其分布在 中Plus似乎没有必要。

通过反复试验,我发现我可以Control.MonadPlus.Free使用新的Then构造函数来扩展 monad:

在这里,新的Then构造函数包含一系列我们忽略其值的 monad,然后是产生实际值的最终 monad。新Monad实例如下所示:

操作符通过替换为“>>封顶”任何现有叶子,将封顶的 monad 附加到列表中,并将值 monad 替换为新的。我知道将新 monad 附加到 的效率低下,但我认为它与将其新 monad 缝合到链的末尾一样糟糕(并且整个事情可以使用延续来重写)。Pure aPure ()++>>=fmap

这似乎是一件合理的事情吗?这是否违反单子定律(这有关系吗?),还是有更好的方法来使用现有的Control.Monad.Free

0 投票
4 回答
2023 浏览

haskell - 为什么是 MonadPlus 而不是 Monad + Monoid?

我试图了解背后的动机MonadPlusMonad如果已经有 typeclasses和 ,为什么还有必要Monoid

当然,实例Monoid是具体类型,而实例Monad需要单个类型参数。(请参阅Monoid vs MonadPlus以获得有用的解释。)但是你不能重写任何类型约束

作为和的Monad组合Monoid

以 的guard函数Control.Monad为例。它的实现是:

我只能使用Monadand来实现它Monoid

MonadPlus有人可以澄清和Monad+之间的真正区别Monoid吗?

0 投票
2 回答
327 浏览

haskell - 在单子变压器类型类中使用列表单子?

我的目标是创建一个函数,该函数在 ReaderT WriterT 堆栈或 RWS 堆栈中使用 list monad。更一般地说,我如何在 mtl 类型类(如 MonadReader、MonadWriter)中使用列表 monad?

我为什么要这样做?这个问题是在开始 Haskell中的一个练习。它要求我“使用 MonadReader 和 MonadWriter 包装基本列表 monad 的功能。要检查该功能是否通用,请使用两个不同的 monad 来 [测试] 请求的功能:ReaderT r (WriterT w []) a并且RWST r w s m a”因此这本书暗示这是可能的。

我不知道如何“告诉”编译器使用列表单子。如果我使用ask >>= liftorask >>= lift . lift我可以让 2 级堆栈 ( RWST []) 或 3 级堆栈 ( ReaderT WriterT []) 工作,但不能同时工作。

我的问题的重点:

另外,我想知道如何键入函数。到目前为止,我最好的尝试看起来像是pathImplicitStack' :: (MonadReader [(Int, Int)] m, MonadWriter [Int] m, MonadPlus m) => Int -> Int -> m () 我知道这是不对的,可能缺少列表单子。另外,我认为 MonadPlus 可能在类型签名中很有用,但我不太确定。

这条线:do (s0, e0) <- ask >>= lift是给我带来麻烦的一条。我尝试了 0、1 和 2 次升降机,但均未成功。我想askfor a[(Int, Int)]然后使用 list monad 来处理 a (Int, Int)(并让 list monad 为我尝试所有可能性)。

作为练习的一部分,我需要能够调用pathImplicitStack'这两个函数(或非常相似的函数):

这与我之前的问题有关:如何在 ReaderT 中使用 list monad?

整个文件便于测试:

编辑

根据 John L 的反馈,我尝试了

但正如他所指出的,它只能与一个 monad 转换器一起使用来包装列表 monad,即 RSWT,并且不能与 ReaderT WriterT 一起使用。所以这不是我正在寻找的解决方案。

0 投票
1 回答
61 浏览

haskell - Maybe MonadPlus Parsers 是否需要按特定顺序排列?

我正在完成wikibooks /haskell上的练习,MonadPlus 章节中有一个练习,希望你编写这个 hexChar 函数。我的函数如下所示工作,但问题是当我尝试切换函数周围的 2 个帮助解析器(digitParse 和 alphaParse)时,它会停止正常工作。如果我切换它们,我只能解析数字而不是字母字符。

为什么会这样?

0 投票
1 回答
558 浏览

loops - 如果 MonadPlus 是“生成器”类,那么什么是“消费者”类?

APipe可以分为两部分:生成器部分 ( yield) 和消费者部分 ( await)。

如果你有一个Pipe只使用它的生成器一半,并且只返回()(或从不返回),那么它可以表示为“ListT正确完成”。事实证明,它MonadPlus可以用来表示像 ListT-done-right 这样的任何东西。引用 Gabriel Gonzalez 的话

请注意,您可以ListT仅使用转换器依赖项构建任何(不仅仅是管道中的)。例如,以下是您将如何实现的ListT模拟Pipes.Prelude.stdinLn

这将像任何类型一样输入 checkListT并为所有这些做正确的事情。

ListT所以我的问题是这样的:管道的MonadPlus消费者部分是否有双重关系?

要求:

  • 一个从不使用yield,只返回()(或从不返回)但确实使用的管道await可以表示为这个“对 ListT”。
  • “dual to ListT”可以推广到“dual of MonadPlus”