问题标签 [monadfix]

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 投票
2 回答
508 浏览

haskell - 是否有 Monad 的实例但没有 MonadFix 的实例?

问题主要在标题中。似乎mfix可以为任何一元计算定义,即使它可能会发散:

这种结构有什么问题?另外,为什么 theMonadMonadFixtypeclasses 是分开的(即什么类型有一个实例Monad但没有 of MonadFix)?

0 投票
2 回答
1284 浏览

haskell - 为什么连续单子不能有 MonadFix 的实例?

我们如何证明延续单子没有有效的实例MonadFix

0 投票
1 回答
1215 浏览

algorithm - 一棵懒惰的、广度优先的单子玫瑰树展开是否可能?

Data.Tree包含unfoldTreeM_BFunfoldForestM_BF函数使用单子动作的结果构建树的广度优先。使用森林展开器可以轻松编写树展开器,因此我将重点关注后者:

从种子列表开始,它对每个种子应用一个函数,生成将产生树根和种子的动作,以用于下一层展开。使用的算法有些严格,因此使用unfoldForestM_BFmonadIdentity与使用 pure 并不完全相同unfoldForest。我一直在试图弄清楚是否有办法让它变得懒惰而不牺牲它的O(n)时间限制。如果(正如 Edward Kmett 向我建议的那样)这是不可能的,我想知道是否可以用更受限制的类型来做到这一点,特别是要求MonadFix而不是Monad. 这里的概念是(以某种方式)设置指向未来计算结果的指针,同时将这些计算添加到待办事项列表中,因此如果它们在早期计算的影响中变得懒惰,它们将立即可用。

0 投票
2 回答
213 浏览

haskell - FreeT生成的解释器monad转换器的MonadFix实例?

我有一个由以下生成的标准解释器单子变换器的简化版本FreeT

p是“提示”,并且r是“环境”......人们可以使用类似的东西来运行它:

我觉得这种类型或多或少只是StateT......如果有的话,Interactive p r IO我认为是IO......我认为......但是......好吧,无论如何,我的直觉说应该有一个很好的例子。

我试着写一个,但我似乎无法弄清楚。到目前为止,我最接近的尝试是:

我还尝试使用利用MonadFix实例的版本m,但也没有运气 -

任何人都知道这是否真的可能,或者为什么不是?如果是的话,我继续寻找的好地方是什么?


或者,在我的实际应用程序中,我什至不需要使用FreeT...我可以使用Free; 也就是说,haveInteractive只是一个 monad 而不仅仅是一个 monad 转换器,并且有

如果这种情况有可能而不是一般的 FreeT 情况,我也会很高兴:)

0 投票
0 回答
325 浏览

haskell - lambda表达式中的波浪号是什么意思?

在本书的第 7 页,定义中有一个波浪号(下图中红色圆圈所示)toggle。波浪号是什么意思?

在此处输入图像描述

0 投票
2 回答
318 浏览

list - [] 的 MonadFix 实例

实例定义为

[]但是对于被视为非确定性计算的单子,我无法理解其背后的直观含义。In mfix ffunctionf的参数不能严格,因此它不能检查参数。而且根据定义,它也不能在其输出中的任何地方使用该参数,否则在某些时候它会碰撞fix (f . head)和发散。那么对于列表还有什么用途(或很好的例子)mfix,除了mfix (const someList)

0 投票
1 回答
85 浏览

haskell - 在 Haskell 中使用 RecursiveDo 生成的重复 EDSL 代码

使用 ghc v8.0.1,使用 -O2 标志编译。

我遇到了 RecursiveDo (mdo) 的问题。有两个稍微不同的函数应该产生相同的输出,但它们不会。

以下函数产生正确的输出:

正确的输出是

以下函数产生不正确的输出:

错误的输出是

从 0007 到 000A 的行是从 0003 到 0006 的行的副本,并且(在这种特殊情况下)最终结果是 0007 处的无限循环。

有问题的代码在 Haskell 中实现了 EDSL(Ting Pen 的汇编程序)。程序的输出是 Ting Pen 的机器码。

我使用 MonadFix 能够捕获汇编语言中的前向标签,并且当我使用一些代码组合器时,我得到了不正确的输出(一些生成的代码被重复)。我已经包含了一些跟踪代码并且能够跟踪代码生成。RecursiveDo 机制有时会产生重复代码(另请参见下面提供的程序的输出)。

程序的输出如下。

proc1 的错误输出:

这是代码重复发生的地方:

proc2 的正确输出:

0 投票
1 回答
422 浏览

haskell - 一棵单子玫瑰树可以有一个 MonadFix 实例吗?

给定

有有效的MonadFix实例吗?

我的尝试是

然而,当我实际尝试使用它时,这似乎并没有终止。该实例在某种程度上受到MonadFix列表实例的启发。

0 投票
2 回答
170 浏览

haskell - 为什么 `MaybeT` 中的 `mfix` 不是全部

如果函数的计算结果为,则for的转换器实现将失败。为什么没有传播过来?MonadFixMaybeTNothingNothingmfix

一定有一个很好的理由我没有看到,因为ListT根本没有实现MonadFix,并以与上面相同的方式Maybe实现它。

0 投票
2 回答
85 浏览

haskell - Haskell:如果遍历参数,则 RWS 上的单子固定点正在循环

我正在编写一个程序,该程序涉及RWS跟踪可变状态并生成一些日志。我的目的是定义一个计算来评估一些动作,收集随后的状态,并根据它在日志的开头附加一些东西。Writer最小的例子:

在这里,我通过在事件发生MonadFix之前写入日志来改变过去。act它完美地返回"1ab"。但是,如果我使用M来遍历状态,那么它会挂起:

这种行为对我来说很奇怪,我不明白为什么这个计算会发散。更难证明其合理性,因为prepend第二个变体中的状态不会在任何程度上改变状态。为什么这个程序不收敛?我可以做些什么来修复(inb4“hehe fix”)吗?

我知道我可以使用Statepart of解决它RWS,但出于某种原因,我想避免它。