问题标签 [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.
haskell - Haskell IO 的 MonadPlus 定义
我只是写了一点代码,我想在 IO Monad 中使用保护功能。但是,对于 IO 没有 MonadPlus 的定义,这意味着我们不能在 IO 领域使用守卫。我已经看到了一个使用 MabyeT 转换器在 Maybe Monad 中使用警卫然后解除所有 IO 操作的示例,但如果我不需要,我真的不想这样做。
我想要的一些例子可能是:
我想知道是否有一种很好的方法可以通过 MonadPlus 的声明或其他方式在 IO Monad 中获取保护函数(或类似的东西)。或者我做错了;有没有更好的方法在上面的函数中编写帮助消息?谢谢。
(PS 我可以使用 if-then-else 语句,但它似乎以某种方式打破了这一点。更不用说对于很多选项它会导致大量的嵌套。)
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 中。
haskell - Haskell State monad 和 monadic 守卫
我有一个小任务来模拟涉及状态的单子代码中的命令式循环,并且应该没有 IO,任务是在条件下退出循环,这是我的尝试:
所以我希望在这里得到类似 4 的东西,而是得到这个神秘的信息:
没有警卫,整个事情都可以正常工作,但出于某种原因,它似乎完全讨厌警卫。
UPD:终于我让它运行起来了,感谢 hammar 的类型提示。尽管它什么都没有返回,但我知道它运行了 5 次,这很酷,不知道它现在有什么用处。
haskell - 需要 MonadPlus (ST a) 实例
我正在阅读Haskell 中的 Typed Logical Variables论文,但我无法理解最终实现的细节。特别是第 4 节中介绍的回溯状态转换器。出于某种我不知道的原因,GHC 认为我需要在函数中的MonadPlus实例,如下所示:(ST a)unify
我不确定问题是什么,以及如何解决它。到目前为止,我的印象是我理解了前面的讨论和代码,但显然我错了。如果有人能指出出了什么问题——我是否需要一个MonadPlus (ST a)实例?- 这将非常有帮助。
[编辑:澄清]我应该指出,作者似乎声称mzero或 的某些变体mzero是适当的功能。我只是不知道合适的功能是什么。我想知道是我应该创建一个MonadPlus (ST a)实例还是我没有使用正确的功能,并且误读了一些东西。
haskell - Haskell: (MonadPlus m => Bool -> a -> ma) 没用吗?
在浏览了 codepad.org之后,我受到了FizzBuzz 的启发,发现自己想要一些功能:
就这样我可以做mwhen (n /? 3) "Foo" `mappend` mwhen (n /? 5) "Bar"
我预计它会在 hoogle 上出现,但没有骰子。
这不是我想的那么有用吗?
haskell - 类型类 MonadPlus、Alternative 和 Monoid 之间的区别?
标准库 Haskell 类型类MonadPlus、Alternative和Monoid每个都提供了两个具有基本相同语义的方法:
- 空值:
mzero、empty或mempty。 a -> a -> a将类型类中的值连接在一起的运算符:mplus、<|>或mappend。
这三个都指定了实例应遵守的这些法律:
因此,似乎这三个类型类都提供了相同的方法。
(Alternative也提供someand many,但它们的默认定义通常就足够了,因此就这个问题而言,它们并不太重要。)
所以,我的疑问是:为什么有这三个极其相似的类?除了它们不同的超类约束之外,它们之间是否有任何真正的区别?
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 有何不同——或意味着不同的东西。
haskell - 什么是 Monad 的一个例子,它是一个 Alternative 但不是 MonadPlus?
Edward Kmett在回答“类型类、和? 之间的区别”</a> 问题时说MonadPlusAlternativeMonoid
此外,即使
Applicative是 的超类Monad,你最终还是需要这个MonadPlus类,因为服从不足以证明
因此,声称某物是 a
MonadPlus比声称它是 强Alternative。
很明显,任何不是monad 的 applicative functor 都会自动成为 an which is not a的一个例子,但 Edward Kmett 的回答暗示存在一个monad,它是 an但不是 a :它并且会满足定律,1但不是法律。2 我自己想不出这样的例子;有人知道吗?AlternativeMonadPlusAlternativeMonadPlusempty<|>AlternativeMonadPlus
1我无法找到一组Alternative法律的规范参考,但我列出了我认为它们大约是我对“类型类的含义及其与其他类型的关系感到困惑”问题的答案的一半类”</a>(搜索短语“右分布”)。我认为应该遵守的四项法则是:Alternative
- (的)右分配
<*>:(f <|> g) <*> a = (f <*> a) <|> (g <*> a) - 右吸收(对于
<*>):empty <*> a = empty - 左分布(的
fmap):f <$> (a <|> b) = (f <$> a) <|> (f <$> b) - 左吸收(对于
fmap):f <$> empty = empty
我也很乐意接受获得一套更有用的Alternative法律。
2我知道法律是什么有些含糊不清MonadPlus;我对使用左分布或左捕获的答案感到满意,尽管我更喜欢前者。
haskell - 如何将失败的计算转换为成功的计算,反之亦然
这很可能是一个寻求问题的解决方案......如果是这样,我请求你的宽容!
可能的实现:
解释是:给定一个成功的计算,让它失败;给定一个失败的计算,让它成功。我不确定,但这似乎与 MonadPlus 正好相反……如果你眯着眼睛真的很用力的话。???
这个概念是否有标准类型类或其他实现?如果有的话,底层数学会是什么样子(即这是一个半群、一个循环等)?
parsing - 如何限制单子转换器解析器组合器中的回溯
tl; dr,我如何实现可以限制回溯的解析器,其中解析器是单子转换器堆栈?
我还没有找到这种方法的任何论文、博客或示例实现;似乎限制回溯的典型方法是具有附加构造函数的数据类型,或者默认情况下关闭回溯的 Parsec 方法。
我目前的实现——使用commit组合器,见下文——是错误的;我不确定类型,它是否属于类型类,而且我的实例不像它们应该的那样通用。
谁能描述如何干净地做到这一点,或指出我的资源?
我在下面添加了我当前的代码;抱歉帖子这么长!
堆栈:
目的是回溯在中间层运行——一个Nothing或一个空列表不一定会产生错误,它只是意味着应该尝试不同的分支——而底层是错误的(有一些上下文信息)立即中止解析。
几个解析类:
他们的例子:
还有几个组合器:
然后这些解析器:
给出这些结果: