问题标签 [alternative-functor]
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.
list - 列表的另一种选择
现在有几次,我发现自己在定义:
当然,这是一个关联操作,空列表[]
既是左标识又是右标识。它的功能类似于 Python 的or
.
在我看来,这会做得很好(<|>)
,比(++)
会更好。选择第一个非空列表感觉更像是我对命名类型类的期望,Alternative
而不是连接列表。诚然,它并不适合MonadPlus
,但我认为这是为救赎付出的小代价。我们已经拥有(++)
和(<>)
在标准库中;我们是否需要另一个同义词,或者一个新功能(据我所知)会更有帮助?
起初我认为这可能是一个很好的Alternative
例子ZipList
,但是在这个答案之后对相关问题的讨论让我信服了。除了向后兼容和保持MonadPlus
明智之外,对于当前实例而不是这个新实例还有什么论据?
haskell - 为什么 runConduit 不发送所有数据?
这是我正在解析的一些xml:
我一直在试图弄清楚如何让管道解析器拒绝记录,除非ows_Category
它包含Weekly Report
并且ows_Document
不包含Spanish
. 起初,我使用一个虚拟值(在parseDoc'
下面)在解析后将它们过滤掉,但后来我意识到我应该能够使用Maybe
(在下面其他相同的情况parseDoc
下),以及用事件使用的层join
折叠我的Maybe
层tag'
基于名称或属性匹配失败的解析器。它可以编译,但行为很奇怪,显然甚至没有尝试将某些元素发送到解析器!这怎么可能?
输出——注意parseDoc
甚至没有发送一条记录(应该成功的记录,从 10.14 开始),而parseDoc'
行为符合预期:
当我尝试通过删除与 相关的所有内容来进一步简化时ows_Category
,突然parseDoc
工作正常,确立了这个想法的合理性?当我改为删除与 相关的所有内容时ows_Document
,问题仍然存在。
我怀疑我应该这样做requireAttrRaw
,但我无法理解它并且找不到文档/示例。
这是否与Applicative
- 现在我想起来了,它不应该基于检查价值观而失败,对吧?
更新
我从作者那里找到了该库先前版本的答案force "fail msg" $ return Nothing
,其中包括在类似情况下的有趣之处,但它放弃了所有解析,而不是仅仅使当前解析失败。
这个评论表明我需要抛出一个异常,并且在源代码中,他们使用类似的东西lift $ throwM $ XmlException "failed check" $ Just event
,但是就像这样force ... return Nothing
,这会杀死所有的解析,而不仅仅是当前的解析器。我也不知道怎么弄到手event
。
这是一个合并的拉取请求,声称已经解决了这个问题,但它没有讨论如何使用它,只是它是“微不足道的”:)
回答
明确回答:
或者,因为在这种情况下可以独立检查属性值:
但后者留下了以下问题requireAttrRaw
:
- 如果我们负责验证,我们不应该知道命名空间
Name
吗? - 为什么要
requireAttrRaw
送我们[Content]
而不是两个Maybe Content
,一个用于ContentText
和ContentEntity
? - 我们应该如何处理
ContentEntity
“For pass-through parsing”?
haskell - 使用 Logic monad 回溯使用 exceptT 引发的异常
我想使用Logic
monad 来确保错误抛出代码(在 monad 堆栈中,包括ExcepT
)在抛出错误时回溯。这是一个简单的例子:
这不会回溯;它不会产生任何结果。lift (msum ...)
我可以通过取消选择操作(即使用而不是现在的普通msum
调用)使其回溯。但是,出于各种原因,我希望能够在ExceptT
monad 中编写代码,并且基本上只是将MonadPlus
实例从 Logic monad 提升到转换后的版本。我试图在这里编写一个自定义MonadPlus
实例来完成此操作:
相同的代码也适用于该Alternative
实例。但是,这实际上并没有帮助。它仍然没有回溯。这个实例有问题吗?有没有更好的方法来解决这个问题?我在尝试做一些没有意义的事情吗?在一天结束时,我总是可以举起所有东西,但宁愿避免这样做。
编辑:一直在搞砸一些。如果我MonadPlus
使用上面的实例,则可以使用mplus
,但如果像上面那样使用,则无法使用...msum
haskell - 如果 a 有 Monoid,是否可以为 Identity a 编写 Alternative 实例?
我想为新类型写一个Alternative
实例Identity
。骨架并不难:
但是,所有类型都无法实现。如果我有一个 Monoid 实例,那将很容易a
:
有没有办法告诉编译器我只想在Alternative
内部类型具有 Monoid 实例时才定义实例?由于a
没有在任何地方提及,我不能只使用约束Monoid a =>
。
haskell - “不可撤销”的应用函子的例子?
我宣布了一个关于应用函子的小组。从我们通常所说的“动作”来看,似乎这样的组可以使动作被撤消:
作为一个群体,对于所有人x :: Undoable f => f a
,以下法律应满足:
一些实例:
至少对我来说,这些例子是没有意义的。一些非实例包括:
Maybe
:一旦成功,无论其他选择如何,它总是会成功。[]
andZipList
: 选项总是添加不确定性,而不是从中减去。ReadP
和ReadPrec
:如上所述。
IO
: 从字面上看,这个实例将是一台时间机器。即使我们可以取现实与时空的商,也有一个实际的反例:一个新的IORef
不能被遗忘。
有什么特别有趣的例子Undoable
吗?
list - Haskell - 为什么要为 List 实施替代方案
我已经阅读了这篇文章的一些替代含义(很长)
引导我去那篇文章的原因是Alternative
总体上了解。这篇文章给出了一个很好的答案,解释了为什么它是以它的方式实现的List
。
我的问题是:
- 为什么要
Alternative
实施List
呢?
是否可能有一种算法使用Alternative
并且List
可能会传递给它,所以定义它以保持一般性?
我想是因为Alternative
默认情况下定义了some
and many
,这可能是其中的一部分,但是What are some and many useful for包含评论:
澄清一下some
,many
对于最基本的类型的定义,例如[]
和Maybe
只是循环。所以虽然some
和many
对它们的定义是有效的,但它没有任何意义。
在上面的“什么是一些有用的”链接中,Will 对可能包含我的问题的答案的 OP 给出了答案,但是在我的 Haskelling 中,森林有点厚,看不到树木。
谢谢
haskell - 如何在 MonadPlus/Alternative 中组合然后分支
我最近写
这似乎很尴尬。我知道protolude
(和其他一些包)定义
但即便如此,这一切都感觉有点手动。有没有一些我没见过的很好的模式来收紧它?