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

haskell - Haskell IO 的 MonadPlus 定义

我只是写了一点代码,我想在 IO Monad 中使用保护功能。但是,对于 IO 没有 MonadPlus 的定义,这意味着我们不能在 IO 领域使用守卫。我已经看到了一个使用 MabyeT 转换器在 Maybe Monad 中使用警卫然后解除所有 IO 操作的示例,但如果我不需要,我真的不想这样做。

我想要的一些例子可能是:

我想知道是否有一种很好的方法可以通过 MonadPlus 的声明或其他方式在 IO Monad 中获取保护函数(或类似的东西)。或者我做错了;有没有更好的方法在上面的函数中编写帮助消息?谢谢。

(PS 我可以使用 if-then-else 语句,但它似乎以某种方式打破了这一点。更不用说对于很多选项它会导致大量的嵌套。)

0 投票
2 回答
2642 浏览

haskell - Monad `fail` 与 MonadPlus `mzero` 的适当使用

这是我在设计代码中多次出现的问题,尤其是库。似乎有人对它感兴趣,所以我认为它可能会成为一个很好的社区 wiki。

Monad 中的fail方法被一些人认为是一个缺点。不是来自原始范畴论的类的有点武断的添加。但当然,在当前状态下,许多 Monad 类型都有合乎逻辑且有用的fail实例。

MonadPlus 类是 Monad 的子类,它提供了一种mzero方法,该方法在逻辑上将失败的想法封装在 monad 中。

因此,想要编写一些执行某种故障处理的 monadic 代码的库设计者可以选择让他的代码使用failMonad 中的方法或将他的代码限制为 MonadPlus 类,这样他就可以对使用感到满意mzero,即使他根本不关心幺半群组合mplus操作。

关于这个主题的一些讨论在这个 wiki 页面中关于改革 MonadPlus 类的建议。


所以我想我有一个具体的问题:

哪些 monad 实例(如果有)具有自然fail方法,但不能是 MonadPlus 的实例,因为它们没有逻辑实现mplus

但我最感兴趣的是关于这个主题的讨论。谢谢!


编辑:我想到了一个最后的想法。我最近了解到(即使它就在 for 的文档中fail)单子“do”符号以模式匹配失败的方式去糖,就像(x:xs) <- return []调用 monad 的fail.

似乎语言设计者一定受到了一些内置在 Haskell 语法中的自动故障处理前景的强烈影响,这些自动故障处理包含fail在 Monad 中。

0 投票
2 回答
2281 浏览

haskell - Haskell State monad 和 monadic 守卫

我有一个小任务来模拟涉及状态的单子代码中的命令式循环,并且应该没有 IO,任务是在条件下退出循环,这是我的尝试:

所以我希望在这里得到类似 4 的东西,而是得到这个神秘的信息:

没有警卫,整个事情都可以正常工作,但出于某种原因,它似乎完全讨厌警卫。

UPD:终于我让它运行起来了,感谢 hammar 的类型提示。尽管它什么都没有返回,但我知道它运行了 5 次,这很酷,不知道它现在有什么用处。

0 投票
2 回答
198 浏览

haskell - 需要 MonadPlus (ST a) 实例

我正在阅读Haskell 中的 Typed Logical Variables论文,但我无法理解最终实现的细节。特别是第 4 节中介绍的回溯状态转换器。出于某种我不知道的原因,GHC 认为我需要在函数中的MonadPlus实例,如下所示:(ST a)unify

我不确定问题是什么,以及如何解决它。到目前为止,我的印象是我理解了前面的讨论和代码,但显然我错了。如果有人能指出出了什么问题——我是否需要一个MonadPlus (ST a)实例?- 这将非常有帮助。

[编辑:澄清]我应该指出,作者似乎声称mzero或 的某些变体mzero是适当的功能。我只是不知道合适的功能是什么。我想知道是我应该创建一个MonadPlus (ST a)实例还是我没有使用正确的功能,并且误读了一些东西。

0 投票
2 回答
259 浏览

haskell - Haskell: (MonadPlus m => Bool -> a -> ma) 没用吗?

在浏览了 codepad.org之后,我受到了FizzBu​​zz 的启发,发现自己想要一些功能:

就这样我可以做mwhen (n /? 3) "Foo" `mappend` mwhen (n /? 5) "Bar"

我预计它会在 hoogle 上出现,但没有骰子

这不是我想的那么有用吗?

0 投票
1 回答
6867 浏览

haskell - 类型类 MonadPlus、Alternative 和 Monoid 之间的区别?

标准库 Haskell 类型类MonadPlusAlternativeMonoid每个都提供了两个具有基本相同语义的方法:

  • 空值:mzeroemptymempty
  • a -> a -> a将类型类中的值连接在一起的运算符: mplus<|>mappend

这三个都指定了实例应遵守的这些法律:

因此,似乎这三个类型类都提供了相同的方法。

Alternative也提供someand many,但它们的默认定义通常就足够了,因此就这个问题而言,它们并不太重要。)

所以,我的疑问是:为什么有这三个极其相似的类?除了它们不同的超类约束之外,它们之间是否有任何真正的区别?

0 投票
5 回答
9110 浏览

haskell - 对“替代”类型类的含义及其与其他类型类的关系感到困惑

我一直在浏览Typeclassopedia来学习类型类。我被困在理解中Alternative(并且MonadPlus,就此而言)。

我遇到的问题:

  • 'pedia 说“Alternative 类型类适用于也具有幺半群结构的 Applicative 函子。” 我不明白——Alternative 不是意味着与 Monoid 完全不同的东西吗?即,我将 Alternative 类型类的要点理解为在两件事之间进行选择,而我将 Monoids 理解为关于组合事物。

  • 为什么 Alternative 需要empty方法/成员?我可能是错的,但它似乎根本没有被使用......至少在我能找到的代码中。而且这似乎不符合课堂的主题——如果我有两件事,并且需要选择一个,我需要一个“空”做什么?

  • 为什么 Alternative 类型类需要一个 Applicative 约束,为什么它需要一种* -> *?为什么不只是有<|> :: a -> a -> a?所有实例仍然可以以相同的方式实现......我认为(不确定)。它提供了 Monoid 没有的什么价值?

  • MonadPlus类型类的意义何在?我不能通过同时使用 aMonad和来解锁它的所有优点Alternative吗?为什么不直接放弃呢?(我确定我错了,但我没有任何反例)

希望所有这些问题都是连贯的......!


赏金更新:@Antal 的回答是一个很好的开始,但 Q3 仍然开放:Alternative 提供了 Monoid 没有提供的什么?我觉得这个答案不能令人满意,因为它缺乏具体的例子,以及关于 Alternative 的更高善意如何将其与 Monoid 区分开来的具体讨论。

如果要将 applicative 的效果与 Monoid 的行为结合起来,为什么不只是:

这对我来说更令人困惑,因为许多 Monoid 实例与 Alternative 实例完全相同。

这就是为什么我要寻找具体的例子来说明为什么 Alternative 是必要的,以及它与 Monoid 有何不同——或意味着不同的东西。

0 投票
1 回答
1041 浏览

haskell - 什么是 Monad 的一个例子,它是一个 Alternative 但不是 MonadPlus?

Edward Kmett在回答“类型类? 之间的区别”</a> 问题时说MonadPlusAlternativeMonoid

此外,即使Applicative是 的超类Monad,你最终还是需要这个MonadPlus类,因为服从

不足以证明

因此,声称某物是 aMonadPlus比声称它是 强Alternative

很明显,任何不是monad 的 applicative functor 都会自动成为 an which is not a一个例子,但 Edward Kmett 的回答暗示存在一个monad,它是 an但不是 a :它并且会满足定律,1但不是法律。2 我自己想不出这样的例子;有人知道吗?AlternativeMonadPlusAlternativeMonadPlusempty<|>AlternativeMonadPlus


1我无法找到一组Alternative法律的规范参考,但我列出了我认为它们大约是我对“类型类的含义及其与其他类型的关系感到困惑”问题的答案的一半类”</a>(搜索短语“右分布”)。我认为应该遵守的四项法则是:Alternative

  1. (的)右分配<*>  (f <|> g) <*> a = (f <*> a) <|> (g <*> a)
  2. 右吸收(对于<*>):  empty <*> a = empty
  3. 左分布(的fmap):  f <$> (a <|> b) = (f <$> a) <|> (f <$> b)
  4. 左吸收(对于fmap):  f <$> empty = empty

我也很乐意接受获得一套更有用的Alternative法律。

2我知道法律是什么有些含糊不清MonadPlus;我对使用左分布或左捕获的答案感到满意,尽管我更喜欢前者。

0 投票
3 回答
189 浏览

haskell - 如何将失败的计算转换为成功的计算,反之亦然

这很可能是一个寻求问题的解决方案......如果是这样,我请求你的宽容!

可能的实现:

解释是:给定一个成功的计算,让它失败;给定一个失败的计算,让它成功。我不确定,但这似乎与 MonadPlus 正好相反……如果你眯着眼睛真的很用力的话。???

这个概念是否有标准类型类或其他实现?如果有的话,底层数学会是什么样子(即这是一个半群、一个循环等)?

0 投票
1 回答
221 浏览

parsing - 如何限制单子转换器解析器组合器中的回溯

tl; dr,我如何实现可以限制回溯的解析器,其中解析器是单子转换器堆栈?

我还没有找到这种方法的任何论文、博客或示例实现;似乎限制回溯的典型方法是具有附加构造函数的数据类型,或者默认情况下关闭回溯的 Parsec 方法。

我目前的实现——使用commit组合器,见下文——是错误的;我不确定类型,它是否属于类型类,而且我的实例不像它们应该的那样通用。

谁能描述如何干净地做到这一点,或指出我的资源?

我在下面添加了我当前的代码;抱歉帖子这么长!


堆栈:

目的是回溯在中间层运行——一个Nothing或一个空列表不一定会产生错误,它只是意味着应该尝试不同的分支——而底层是错误的(有一些上下文信息)立即中止解析。

几个解析类:

他们的例子:

还有几个组合器:

然后这些解析器:

给出这些结果: