问题标签 [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 代码的库设计者可以选择让他的代码使用fail
Monad 中的方法或将他的代码限制为 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
也提供some
and 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> 问题时说MonadPlus
Alternative
Monoid
此外,即使
Applicative
是 的超类Monad
,你最终还是需要这个MonadPlus
类,因为服从不足以证明
因此,声称某物是 a
MonadPlus
比声称它是 强Alternative
。
很明显,任何不是monad 的 applicative functor 都会自动成为 an which is not a的一个例子,但 Edward Kmett 的回答暗示存在一个monad,它是 an但不是 a :它并且会满足定律,1但不是法律。2 我自己想不出这样的例子;有人知道吗?Alternative
MonadPlus
Alternative
MonadPlus
empty
<|>
Alternative
MonadPlus
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
或一个空列表不一定会产生错误,它只是意味着应该尝试不同的分支——而底层是错误的(有一些上下文信息)立即中止解析。
几个解析类:
他们的例子:
还有几个组合器:
然后这些解析器:
给出这些结果: