问题标签 [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.

0 投票
1 回答
120 浏览

list - Understanding function with <|> operator

I have the following type:

The type Rep f a is a stateful computation that takes a String as the initial state and produces a (String, a) as the result of the computation. The result of the computation is wrapped in the functor f.

The Applicative instance for Rep is the following:

And the Monad instance for Rep is the following:

The Alternative instance for Rep is the following:

I have the following data types and function:

I am having trouble understanding the function above. The function frontAdd creates a Special value which contains a list of [Res]. findmatch returns Rep f Res. The line frontAdd <$> findmatch a <*> findmatch (Str a) applies frontAdd to the Res that is returned by findmatch a and findmatch (Str a).

However, I am not sure how this line, with the pattern matching, works: frontAdd x (Special xs) = Special (x:xs). Further, assuming that the functor f is [ ], how would the <|> in frontAdd <$> findmatch a <*> findmatch (Str a) <|> pure (Special []) work? I know that if the functor f is Maybe, then <|> makes a left-biased choice, but I don't know how <|> works specifically for lists. In the documentation it states:

How exactly does the concatenation work? Am I correct in saying that the result of frontAdd <$> findmatch a <*> findmatch (Str a) is concatenated with the empty list?

Any insights are appreciated.

0 投票
3 回答
201 浏览

haskell - 为什么 throw 和 throwIO 有区别?

我试图牢牢掌握异常,以便改进我的条件循环实现。为此,我进行了各种实验,扔东西,看看会被抓到什么。

这个让我惊喜不已:

我认为替代方案应该完全忽略 IO 错误。(不知道我从哪里得到这个想法,但我当然不能提供一个在替代链中会被忽略的非 IO 异常。)所以我想我可以手工制作并提供一个 IO 错误。事实证明,它是否被忽略取决于包装和内容:如果我throw是一个 IO 错误,它就不再是一个 IO 错误。

我完全迷路了。为什么它会这样工作?是有意的吗?这些定义深入到 GHC 内部模块;虽然我自己或多或少可以理解不同代码片段的含义,但我很难看到整个画面。

如果很难预测,甚至应该使用这个替代实例吗?如果它消除任何同步异常,而不仅仅是以特定方式定义并以特定方式抛出的一小部分异常,这不是更好吗?

0 投票
1 回答
92 浏览

haskell - 如何使用函数`some`?

我想使用http://hackage.haskell.org/package/base-4.12.0.0/docs/src/GHC.Base.html#somesome中的功能。Alternative

我试过了:

如您所见,我中断了输入。如何使用该some功能?

0 投票
1 回答
248 浏览

parsing - 应用程序解析器陷入无限循环

我正在尝试实现自己的 Applicative 解析器,这是我使用的代码:

当我运行它时,它会卡住并且永远不会返回。在深入研究问题后,我确定了根本原因是我实施该<|>方法。如果我使用以下实现,那么一切都会按预期进行:

在我的理解中,这两个实现是相当等价的。我猜这可能与 Haskell 的惰性评估方案有关。有人可以解释发生了什么吗?

0 投票
0 回答
41 浏览

haskell - 在自定义解析器上调用许多时无限循环

我松散地遵循斯蒂芬迪尔的写你一个 Haskell来实现我自己的解析器。但是,我被困在调用并将进入无限循环的many地步some。我已经使用 将循环精确到解析器的fmap函数trace,但我无法弄清楚为什么会发生循环。查看and的源代码somemany,似乎唯一被调用的其他函数是<*>(通过liftA2), pureand <|>; 我尝试trace对所有这些函数进行调用,但这些函数都没有出现在 stdout 上。

我的解析器的基本部分如下所示:

调用manysome显示以下输出:

据我所知,我的功能已正确实现。为什么会fmap发生这种无限循环?

0 投票
2 回答
122 浏览

haskell - 从一组单子动作中获取第一个“非空”值的标准组合器

我确定我在这里遗漏了一些非常明显的东西。这是我试图在概念层面实现的目标:

这个假设someCombinator存在吗?我试过玩<|>msum但无法得到我想要的。

我想,这可以概括为两种方式:

0 投票
1 回答
147 浏览

haskell - Haskell 用于推测执行条件/替代的策略

我想知道哪种并行策略、spark 或其他什么可以用于递归执行包含大量条件测试的 Haskell 程序。

假设一个程序有很多条件测试,递归。我想如果使用火花,那么大多数火花将在无用的分支上工作。火花生命周期不包括取消。

一个可行的策略必须能够在依赖树中有效地创建,但也可以取消工作单元。

例如,考虑解析文本的问题。解析器由一个巨大的树组成,基本上:

在给定的条件下,我们直到很久以后才能知道我们是否会回溯。通过推测性地执行另一个分支,我们可以更快地解决这个问题。

但是,如果我们只使用火花,那么无用的工作就会呈指数级增长,而且我们不会获得太多的加速。当我们知道它永远不会被占用时,必须有一种方法可以取消已经在分支上开始的工作。

对此的概括是对实现的任何数据类型的推测执行Alternative,其想法是取消从未观察到的替代方案不会改变程序的语义。所以a <|> bwhereb不是从表达式返回的,可以短路,比如在推测执行期间抛出异常,而不影响语义。

你会如何在 Haskell 中解决这个问题?

0 投票
3 回答
163 浏览

haskell - 与 Alternative empty 或 Applicative pure 的模式匹配

我知道有可能对(命名的)构造函数进行模式匹配,如下所示:

我怎样才能为 general Alternatives 编写这样的函数,类似于

如果我尝试这个,我会得到错误Parse error in pattern: empty。我想这是有道理的,作为empty这里的函数而不是构造函数。但是,我怎样才能以Alternative惯用的方式为 general 做到这一点?

编辑 1: 我的实际目标是为自定义结果类型定义一个Monad实例(也可能是一个MonadPlus实例)。除了基本Either Error Result类型,它应该支持 a Maybe Error(如果可能还有其他Alternatives like [Error])作为错误类型,还应该支持一些Applicative作为结果类型,以支持惰性求值,例如使用分(Maybe Error, [Tokens])词器的结果类型。

我想要类似的东西

0 投票
1 回答
449 浏览

haskell - 每个替代 Monad 都是可过滤的吗?

集合的范畴既是笛卡尔幺半群又是 cocartesian monoidal。下面列出了见证这两个幺半群结构的规范同构的类型:


出于这个问题的目的,我将其定义Alternative为从张量下的EitherHask 到张量下的 Hask (,)(仅此而已)的松弛幺半群函子:

这些定律只是针对松散单曲面函子的定律。

关联性:

左单元:

右单位:

以下是如何Alternative根据松散的幺半群函子编码的相干映射恢复类型类的更熟悉的操作:


我将Filterable函子定义为从张量下的 Hask 到张量下的 Haskoplax 单曲面函子:Either(,)

它的定律只是向后宽松的单曲面函子定律:

关联性:

左单元:

右单位:

定义标准的 filter-y 函数,例如mapMaybefilter根据 oplax monoidal functor encoding 留给感兴趣的读者作为练习:


问题是这样的:每个Alternative Monad也是Filterable吗?

我们可以输入俄罗斯方块来实现:

但是这种实施总是合法的吗?有时是否合法(对于“有时”的一些正式定义)?证明、反例和/或非正式论证都将非常有用。谢谢。

0 投票
0 回答
61 浏览

parsing - Alternative 的“一些”和“许多”功能是做什么的?

我正在通过 Write You a Haskell 工作,并且我正在他实现“Nanoparsec”的部分,这是一个来自第一原理的 Haskell 解析器。我被困在Alternative解析器的实例上,特别是somemany实现:

我不知道这两个函数在做什么。从我所见,some获取一个解析器,应用它,然后连接结果,直到输入用完。但many看起来它做同样的事情。这里发生了什么事?