问题标签 [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 - 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.
haskell - 为什么 throw 和 throwIO 有区别?
我试图牢牢掌握异常,以便改进我的条件循环实现。为此,我进行了各种实验,扔东西,看看会被抓到什么。
这个让我惊喜不已:
我认为替代方案应该完全忽略 IO 错误。(不知道我从哪里得到这个想法,但我当然不能提供一个在替代链中会被忽略的非 IO 异常。)所以我想我可以手工制作并提供一个 IO 错误。事实证明,它是否被忽略取决于包装和内容:如果我throw
是一个 IO 错误,它就不再是一个 IO 错误。
我完全迷路了。为什么它会这样工作?是有意的吗?这些定义深入到 GHC 内部模块;虽然我自己或多或少可以理解不同代码片段的含义,但我很难看到整个画面。
如果很难预测,甚至应该使用这个替代实例吗?如果它消除任何同步异常,而不仅仅是以特定方式定义并以特定方式抛出的一小部分异常,这不是更好吗?
haskell - 如何使用函数`some`?
我想使用http://hackage.haskell.org/package/base-4.12.0.0/docs/src/GHC.Base.html#somesome
中的功能。Alternative
我试过了:
如您所见,我中断了输入。如何使用该some
功能?
parsing - 应用程序解析器陷入无限循环
我正在尝试实现自己的 Applicative 解析器,这是我使用的代码:
当我运行它时,它会卡住并且永远不会返回。在深入研究问题后,我确定了根本原因是我实施该<|>
方法。如果我使用以下实现,那么一切都会按预期进行:
在我的理解中,这两个实现是相当等价的。我猜这可能与 Haskell 的惰性评估方案有关。有人可以解释发生了什么吗?
haskell - 在自定义解析器上调用许多时无限循环
我松散地遵循斯蒂芬迪尔的写你一个 Haskell来实现我自己的解析器。但是,我被困在调用并将进入无限循环的many
地步some
。我已经使用 将循环精确到解析器的fmap
函数trace
,但我无法弄清楚为什么会发生循环。查看and的源代码some
many
,似乎唯一被调用的其他函数是<*>
(通过liftA2)
, pure
and <|>
; 我尝试trace
对所有这些函数进行调用,但这些函数都没有出现在 stdout 上。
我的解析器的基本部分如下所示:
调用many
或some
显示以下输出:
据我所知,我的功能已正确实现。为什么会fmap
发生这种无限循环?
haskell - 从一组单子动作中获取第一个“非空”值的标准组合器
我确定我在这里遗漏了一些非常明显的东西。这是我试图在概念层面实现的目标:
这个假设someCombinator
存在吗?我试过玩<|>
,msum
但无法得到我想要的。
我想,这可以概括为两种方式:
haskell - Haskell 用于推测执行条件/替代的策略
我想知道哪种并行策略、spark 或其他什么可以用于递归执行包含大量条件测试的 Haskell 程序。
假设一个程序有很多条件测试,递归。我想如果使用火花,那么大多数火花将在无用的分支上工作。火花生命周期不包括取消。
一个可行的策略必须能够在依赖树中有效地创建,但也可以取消工作单元。
例如,考虑解析文本的问题。解析器由一个巨大的树组成,基本上:
在给定的条件下,我们直到很久以后才能知道我们是否会回溯。通过推测性地执行另一个分支,我们可以更快地解决这个问题。
但是,如果我们只使用火花,那么无用的工作就会呈指数级增长,而且我们不会获得太多的加速。当我们知道它永远不会被占用时,必须有一种方法可以取消已经在分支上开始的工作。
对此的概括是对实现的任何数据类型的推测执行Alternative
,其想法是取消从未观察到的替代方案不会改变程序的语义。所以a <|> b
whereb
不是从表达式返回的,可以短路,比如在推测执行期间抛出异常,而不影响语义。
你会如何在 Haskell 中解决这个问题?
haskell - 与 Alternative empty 或 Applicative pure 的模式匹配
我知道有可能对(命名的)构造函数进行模式匹配,如下所示:
我怎样才能为 general Alternative
s 编写这样的函数,类似于
如果我尝试这个,我会得到错误Parse error in pattern: empty
。我想这是有道理的,作为empty
这里的函数而不是构造函数。但是,我怎样才能以Alternative
惯用的方式为 general 做到这一点?
编辑 1:
我的实际目标是为自定义结果类型定义一个Monad
实例(也可能是一个MonadPlus
实例)。除了基本Either Error Result
类型,它应该支持 a Maybe Error
(如果可能还有其他Alternative
s like [Error]
)作为错误类型,还应该支持一些Applicative
作为结果类型,以支持惰性求值,例如使用分(Maybe Error, [Tokens])
词器的结果类型。
我想要类似的东西
haskell - 每个替代 Monad 都是可过滤的吗?
集合的范畴既是笛卡尔幺半群又是 cocartesian monoidal。下面列出了见证这两个幺半群结构的规范同构的类型:
出于这个问题的目的,我将其定义Alternative
为从张量下的Either
Hask 到张量下的 Hask (,)
(仅此而已)的松弛幺半群函子:
这些定律只是针对松散单曲面函子的定律。
关联性:
左单元:
右单位:
以下是如何Alternative
根据松散的幺半群函子编码的相干映射恢复类型类的更熟悉的操作:
我将Filterable
函子定义为从张量下的 Hask 到张量下的 Hask的oplax 单曲面函子:Either
(,)
它的定律只是向后宽松的单曲面函子定律:
关联性:
左单元:
右单位:
定义标准的 filter-y 函数,例如mapMaybe
并filter
根据 oplax monoidal functor encoding 留给感兴趣的读者作为练习:
问题是这样的:每个Alternative
Monad
也是Filterable
吗?
我们可以输入俄罗斯方块来实现:
但是这种实施总是合法的吗?有时是否合法(对于“有时”的一些正式定义)?证明、反例和/或非正式论证都将非常有用。谢谢。
parsing - Alternative 的“一些”和“许多”功能是做什么的?
我正在通过 Write You a Haskell 工作,并且我正在他实现“Nanoparsec”的部分,这是一个来自第一原理的 Haskell 解析器。我被困在Alternative
解析器的实例上,特别是some
和many
实现:
我不知道这两个函数在做什么。从我所见,some
获取一个解析器,应用它,然后连接结果,直到输入用完。但many
看起来它做同样的事情。这里发生了什么事?